返回首页

目录{A}
注意:这篇文章是用。NET框架3.0(RTM)VS 2005的扩展对Windows Workflow Foundation(RTM)松耦合和紧耦合的检测仪器自动发布所选的活动属性明确采集工作流程属性支持顺序​​和/或状态的工作流激活类型或XOML接口契约驱动的连接任何物理连接的开放式连接模式内置与WCF连接在Windows TreeView的控制器查看消息
WorkflowProbe是一个自定义的Windows Workflow Foundation(WF)的活动,使捕获的数据的Windows Communication Foundation(WCF)频道发布。基本上,有两个数据捕获种:紧密和松散的耦合。在第一种情况下,探头纳入基于应用程序需要的代码。这过程中,仪​​表等,需要编译和部署周期。它是适用于出版与代码中的一个固定位置的检查站和/或错误异常。请注意,这种情况下只使用一个WorkflowProbe出版商。后来看到更多细节。
捕捉业务数据的其他选择插入工作流探头,像一个活动,和有约束力的出版目的的属性。探头可插入的XOML工作流定义在松散耦合的方式没有任何后面的代码。动态修改的工作流程和探头的XOML激活工作流是一个很大的特点。
WorkflowProbe does't需要设置任何属性。然而,对于有关业务数据流的捕获更多的细节,探头可配置的具体使用标准的约束机制的检查点。下面的屏幕片段显示WorkflowProbe属性:
{S0}
作为上面的图片显示,有四个大类的属性:连接选择一个特定的WCF出版商代理标签的属性组序列化和快速查询处理后单独保存选项​​/ CaptureActivity使所有公共捕捉,从选定的活动序列化属性参数是允许捕获任何工作流程的可见属性WorkflowBindingParameters的集合。收集字符串和对象,其中的字符串表示一个参数的名称是对。请注意,出版商也将增加一个分隔字符属性的名称后面的绑定信息。
除了上面的属性,出版商将增加额外的工作流的有用信息。下面的代码片段显示了消防和忘记消息发布服务合同。基于此接口的合同,该消息可以传递到服务,通过不同的渠道,绑定和行为。

[ServiceContract]

public interface IProbe

{

    [OperationContract(IsOneWay = true)]

    void WriteMessage(

        DateTime timestamp,     // captured timestamp

        string severity,         // message severity (i.e. Checkpoint, Error)

        string rootActivity,     // the Probe Root Activity 

        string location,         // location of the Probe (the Probe name)

        string topic,        // application specific topic 

        string key,         // application specific key

        string message,         // application specific message text

        Guid contextId,         // activity execution context Id

        Guid instanceId,         // workflow instance Id

        string machineName,     // Netbios machine name

        string appDomainName,     // appDomain name

        IDictionary<string, object> parameters    

            // collection of the captured properties

    );

}

从连接点的看法,发布代表了用户事件接收器(服务)松散耦合的事件源。我们可以设计许多不同的事件汇根据业务需要使用WCF和WPF技术。本文包括一个观众在Windows窗体TreeView控件的探测消息。下面的截图显示了一个通过WCF通道(​​netNamedPipeBinding绑定)连接到WorkflowProbe WorkflowProbeViewer方案:

WorkflowProbeViewer是一个微小的非持久化存储其互动检查的探测消息。传入的​​消息是基于过滤,严重程度等选项的TreeView节点存储等更多细节。 WorkflowProbe出版商WCF通信模型,它允许通过配置许多变种的设计和实施。下面的配置片段显示默认连接,通过在客户端和服务器端netNamedPipeBinding的通道。
客户端:{C}
服务器端:
<system.serviceModel>

    <services>

        <service name="RKiss.WorkflowProbe.ProbeSink" >

            <endpoint 

                address="net.pipe://localhost/WorkflowProbeService/console" 

                binding="netNamedPipeBinding" 

                contract="RKiss.WorkflowProbe.IProbe"/>

        </service>

    </services> 

</system.serviceModel>

正如你可以看到,它是直接改变另一个绑定,地址的端点等任何连接相关的变化是通过简单的重新启动的工作流程和观众方案,做行政。
改变获取更多的数据,出版商名称等,如WorkflowProbe属性,我们基本上有两种选择的基础上如何激活工作流。在激活工作流类型的情况下,我们必须重建工作流(紧耦合仪器),并重新启动它。第二种选择,工作流的XOML激活 - 它背后有没有代码的含义 - 使用WorkflowProbe是非常友好和松散耦合,如捕获数据的任何变化,堵塞更多的探头,连接等以下图为一个WorklowProbe的XOML激活顺序工作流的例子:Probe1。
{S2}
上述Probe1捕获的时延1活动的所有公共属性。此外,Delay1.TimeoutDuration已附加到Parameters集合。这是很容易使任何在根据捕捉到的消息的XOML资源的动态变化,调整业务流程。
WorkflowProbeViewer可以收集许多工作流程的探测消息。然而,对于企业的分布式应用程序,它是适合存储到数据库中的消息,并创建一个后处理工具,如监控,调整,分析等应用程序的行为的知识库接口契约允许直接存储一个quot ; parallelquot;消息的具体工作流程中的快速查询所需的信息。
正如我刚才所说,捕获到的数据默认DataContractSerializer的序列化WCF通道。串行器在运行时,需要知道所有的对象类型。否则,该参数将显示一条警告消息。缺少的类型,可以添加到配置文件,在下面的配置片段所示:
{S3}
在上面的例子,Dictionarylt,T,KGT;类型已被添加到的序列化。请注意,WorkflowProbeViewer不反序列化的探针消息。因此,它将为任何类型的工作,因为我们只需要显示邮件正文中的元素和属性。
这是所有的基本介绍WorkflowProbe。现在,我想这个用人的接口契约的探头显示出一些高级用法。高级WorkflowProbe功能WorkflowProbe接口契约允许生成另一个工作流或WCF服务应用程序特定的消息。有关接口的合约驱动的通讯与工作流程的更具体的描述中可以找到我的文章A9},在这种情况下,WorkflowProbe适配器的活动,在消防和忘​​记的方式连接器发送一条消息。下面的图片显示了一个连接状态机工作流,它的处理器状态等待的IProbe消息由Connector_Fire活动。请注意,这种情况下只需要正确的配置和有约束力的参数。
{S4}的WorkflowProbe出版商可以使用内码,发送IProbe消息到另一个工作流或WCF服务。该消息可以胜任适当的严重性。下面的代码片段显示了如何轻松的消息是不带任何附加参数发送:
// send info message via the default publisher

Probe.Info(this, "MyTopic", "MyKey", "MyMessage", null);



// send error message via the default publisher

Probe.Error(this, "MyTopic", "MyKey", exception", null);



// send info message via MyPublisher publisher

Probe.Write(this,"MyPublisher", Severity.Info, 

    topic,key, message, null, null);
连接到模式是允许的。从视图的WS -事物的规格上来看,WorkflowProbe代表事件来源的事件接收器。订阅服务器订阅的事件接收器的利益 - 包括主题/关键过滤器 - IProbe消息提供特定的事件接收器的订阅管理。探头连接到通知管理,消息传递的基础上积极认购存储订阅。当然,事件接收器,可以对工作流程的连接器(S),以及。登记认购的基础上,IProbe消息可以交付通过的TCP,P2P,HTTP,MSMQ,命名管道等,如绑定到许多不同的事件接收器,下面的图片显示了WS - *的驱动服务总线WorkflowProbe位置:
{五}WorkflowProbeViewer
WorkflowProbeViewer是一个微小的监控工具,存储,并探讨在Windows TreeView的控制器IProbe消息。 IProbe消息合同分为两个部分。第一个被称为与预定义的属性(时间戳,主题,重点等)的平行消息。这种并行的探测信息,代表了独特的后处理查询IProbe信息的关键。该消息的另一部分则是后过程中的利益为基础的工作流程属性的集合。这部分序列在Dictionarylt;字符串,objectgt;对象。下图显示了一个一个IProbe Probe1的Workflow1捕获的消息的例子:
{中六}
请注意,TreeView节点显示的参数的类型。如果已通过绑定过程中检索参数的值,此信息显示在节点的标签。例如:Workflow1.TestNumber /(Workflow1,路径= TestNumber)。 WorkflowProbeViewer的功能是可以改变的通过上下文菜单。右键点击TreeView的pannel,我们将看到下列项目:
{七}
在上下文菜单中有3个主要项目:查找上下文是扩大到相同ContextId的所有相关节点。按F4键,我们可以展开/折叠这些节点。循环使TreeView节点的最大数量IProbe消息流通。节点的默认数为100,但它可以在配置文件中改变。过滤器可过滤特定的传入IProbe消息存储在TreeView节点之前。
正如你可以看到下面的图片,WorkflowProbeViewer使用WF规则集编辑器建立一个消息过滤器。 ProbeMessageControl对象传递到RuleExecution,我们可以控制的,如maxNumberOfSamples,EnableProbe,CirculateSamples,ExpandNode等的消息和存储
{S8}
以上的Rule1已成立了存储短消息(无参数)时主题== quot; Test1quot;和关键=="XOMLquot;我们可以创建许多规则和规则集,并通过上下文菜单选择。
WorkflowProbe的概念是基于WCF通道在消防和忘​​记的方式发送消息。 IProbe消息可以以编程方式创建在工作流代码或自定义WorkflowProbe活动。下面的代码片段显示了一个执行覆盖WorkflowProbe活动,执行逻辑划分成3个主要部分的方法:收集捕获的参数,从选定活动中收集的参数和调用的静态Probe.Write方法的出版商。
protected override ActivityExecutionStatus Execute(

    ActivityExecutionContext executionContext)

{

    Activity activity = executionContext.Activity.Parent;



    // intercept before the call

    base.RaiseEvent(WorkflowProbe.InvokingEvent, this, EventArgs.Empty);

    OnInvoking(this);



    // explicitly captured workflow parameters           

    Dictionary<string, object> parameters = 

        CollectParameters(this.Parameters, null);



    // implicitly captured activity parameters

    if (this.CaptureActivity != "(none)")

    {

        Activity selActivity = 

            activity.GetActivityByName(this.CaptureActivity);

        if (selActivity != null)

        {

            Activity selectedActivity = 

                activity.GetActivityByName(this.CaptureActivity);

            if (selectedActivity != null)

            {

                Dictionary<string, object> activityProperties = 

                    CollectActivityParameters(selectedActivity, null);

                parameters.Add(selectedActivity.QualifiedName, 

                    activityProperties);

            }

        }   

    }



    // publish

    Probe.Write(this, this.Publisher, this.Severity, 

        this.QualifiedName, this.Topic, 

        this.Key, this.Message, parameters);



    return ActivityExecutionStatus.Closed;

}

出版商代理是一个标准的WCF通道代理出版商配置参数:
// publisher proxy

ChannelFactory<IProbe> factory = new ChannelFactory<IProbe>(publisher);

channel = factory.CreateChannel();



channel.WriteMessage(DateTime.Now, severity.ToString(), 

    rootActivity, location, topic, 

    key, message, contextId, instanceId, Environment.MachineName, 

    AppDomain.CurrentDomain.FriendlyName, parameters);

  

    ((IChannel)channel).Close();

注意出版商代理不会抛出任何异常,并宣布为单向服务操作。因此,代理不会等待消息传递服务(即消防和忘记消息模式)。要接收Windows窗体程序IProbe消息,我们需要创建一个服务合同服务类和主机在Windows窗体。下面的代码片段显示了管道; ServiceHostBasegt WCF服务与Windows使用的IExtensionlt表格;机制:
namespace RKiss.WorkflowProbe

{

    #region Interface Contract

    [ServiceContract]

    public interface IProbe

    {

        [OperationContract(IsOneWay = true)]

        [ServiceKnownTypeAttribute(typeof(Exception))]

        void WriteMessage(Message message);

    }

    #endregion

  

    #region Service

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]

    public class ProbeSink : IProbe

    {

        #region IProbe Members

        public void WriteMessage(System.ServiceModel.Channels.Message message)

        {

            Form1 form = 

                OperationContext.Current.Host.Extensions.Find<Form1>();

            XmlDictionaryReader reader = message.GetReaderAtBodyContents();

            ProbeMessageControl pm = new ProbeMessageControl(reader);

            form.AddToTheTreeView(pm);

        }

        #endregion

    }

    #endregion

}

下面的代码片段显示了如何将Form1已连接到ServiceHost的:
[STAThread]

static void Main()

{

    ServiceHost host = null;

    try

    {

        Application.EnableVisualStyles();

        Application.SetCompatibleTextRenderingDefault(false);

        Form1 form = new Form1();



        host = new ServiceHost(typeof(ProbeSink));

        host.Extensions.Add(form);

        host.Open();



        Application.Run(form);

    }

    catch (Exception ex)

    {

        Trace.WriteLine(ex);

    }

    finally

    {

        if (host != null)

            host.Close();

    }

}

这是所有WorkflowProbe的概念及其实施情况的描述。让我们开始测试。
WorkflowProbe解决方案包含几个项目。项目主要有两个:WorkflowProbe(发布)和WorkflowProbeViewer(用户)。出于测试目的,该解决方案包含客户和WorkflowLibrary项目。 WorkflowProbe用法需要添加WorkflowProbe.dll大会的应用程序的bin文件夹或插入到GAC。下图显示了这些项目在WorkflowProbe解决方案:

WorkflowProbe测试是基于两个工作流程样本类型和XOML(Workflow1和Workflow2)仪表与WorkflowProbes激活。下面的代码片段显示了一个客户端的测试循环:
for (int ii = 0; ii < 100; ii++)

{

    // activate type workflow

    Dictionary<STRING, object> initdata = new Dictionary<STRING, object>();

    initdata["TestNumber"] = ii;

    WorkflowInstance instance1 = 

        workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary.Workflow1), 

        initdata);

    instance1.Start();

  

    // activate xoml workflow

    string filename = @"..\..\..\WorkflowLibrary\Workflow2.xoml";

    using (XmlTextReader reader = new XmlTextReader(filename))

    {

        WorkflowInstance instance2 = workflowRuntime.CreateWorkflow(reader);

        instance2.Start();

    }

  

    waitHandle.WaitOne();

  

    Console.WriteLine("Press any key to continue ...");

    Console.ReadLine();

}

现在我们可以启动WorkflowProbeViewer和客户端(测试)方案。测试仪控制台上按回车键,工作流将产生四个IProbe消息。下图为本次测试:
{S10}
的消息,可扩展,以考察其上下文。已成功测试循环后,WorkflowProbe可以插入到应用程序的工作流程,并收集WorkflowProbeViewer消息。请注意,应用程序配置文件需要添加WCF代理配置。下面是一个命名管道绑定客户端WorkflowProbe的代理通道配置的例子:
<system.serviceModel>

    <client>



        <endpoint name="WorkflowProbe" 

            address="net.pipe://localhost/WorkflowProbeService/console" 

            binding="netNamedPipeBinding" 

            contract="RKiss.WorkflowProbe.IProbe"/>

    </client>

</system.serviceModel>
{A13}
本文描述WorkflowProbe定制活动,为捕捉工作流程属性和出版WorkflowProbeViewer如用户通过WCF通道。 WorkflowProbe订户可以根据业务需要为不同的WCF服务的设计和实施。此外,WorkflowProbe可用于触发一个事件到另一个工作流程或服务的消息。的WorkflowProbe的主要用途是解决的业务流程的数据和行为。它是免费的,微小的跟踪工具。{A14}2006年11月5日 - 原始版本发表于2006年11月10日,日 - 更新编辑和发布的主要CodeProject.com文章基地,2007年6月12日 - 第

回答

评论会员:sokalamax 时间:2011/12/07
很好的解释..感谢
评论会员:汤姆代码 时间:2011/12/07
我要问:首先,我选择"代码1",然后,我删除"代码1"活动。 "CaptureActivity"物业WorkflowProbe不会改变空。我在我的WF项目,如"CaptureActivity"的属性,我可以不解决这个problem.Can你能给我一些建议,谢谢。
评论会员:Wcohen 时间:2011/12/07
!大和彻底explenation

你有我的五!


感谢,
科恩

{A15}
评论会员:罗马吻 时间:2011/12/07
科恩,

感谢阅读和voiting我的文章(S)。

罗马



微软MVP / Windows服务器系统 - 连接系统开发
评论会员:罗马吻 时间:2011/12/07
感谢

罗马

微软MVP / Windows服务器系统 - 连接系统开发
评论会员:理查德槌 时间:2011/12/07
不跟踪这样的信息,更好地聚集通过自定义工作流跟踪服务,从而避免了需要的操作流程本身?我承认有可能是一个地方为,但是,跟踪服务活动VS几乎就像不同的遍历代码和使用VS在把一堆Console.WriteLine调用的手表之间通过调试似乎。
评论会员:罗马吻 时间:2011/12/07
嗨理查德,

感谢您阅读我的文章(S)。我同意你的看法,WF已建成的自定义工作流跟踪服务允许创建一个自定义的配置文件和通道(出版商)的机制。我已经建立了一个和紧耦合的仪器,它是非常有用。当然,还有一种可能性使一些配置的变化,如用户档案,跟踪服务,渠道等,但是这一步将需要重新启动AppDomain的。

假设我们有XOML工作流驱动的企业分布式应用程序在持久化到数据库。此外,我们还捕获工作流的行为已在启动顺序中添加一个共同的自定义跟踪服务。

插入XOML工作流程和绑定应用程序特定的属性,我们可以捕捉飞在松散耦合的方式为额外的业务数据处理后行动WorkflowProbe(网页设计师)。
请注意,WorkflowProbe事件消息可以与跟踪记录使用上下文ID。

感谢

罗马

微软MVP / Windows服务器系统 - 连接系统开发
评论会员:aerradi 时间:2011/12/07
感谢罗马,
作为usuall优秀WF活动。感谢你的努力和分享这种有益的工作。
关于
卡里姆{S11}