在工作流中使用本地服务

Windows Workflow Foundation 支持工作流的承载环境中的本地通信和使用 Web 服务在工作流之间进行的通信。 有关使用 Web 服务的工作流通信的更多信息,请参见与其他工作流通信

Windows Workflow Foundation 工作流通信服务向工作流编写器公开用户定义的服务类,作为方法调用和事件处理程序,以简化出站和入站消息交换的建模。 单个服务类实例到多个工作流实例的多路复用允许主机编写器对出站消息的单个位置进行编程,而引发事件时仍针对特定工作流实例。

下图演示本地通信服务如何与其主机应用程序通信。

本地主机通信

工作流实例上的 HandleExternalEventActivityCallExternalMethodActivity 活动与在自定义接口中声明并在自定义本地服务中实现的事件和方法交互。 HandleExternalEventActivity 活动响应由主机应用程序引发且由本地服务实现的特定事件。 CallExternalMethodActivity 对本地服务调用方法。 有关如何使用 HandleExternalEventActivityCallExternalMethodActivity 的更多信息,请参见使用 HandleExternalEventActivity 活动使用 CallExternalMethodActivity 活动

工作流通信服务

Windows Workflow Foundation 工作流通信服务实现一种供对象与工作流实例通信的简单机制。 通信通道的定义是一个接口,其实现是添加到运行时以方便通信的服务类。

对于服务类,工作流的行为很像任何其他类,您通过引发事件和接收方法调用与其通信。 对于工作流,通信接口显示为包含入站事件接收和出站操作方法调用的通道。

ExternalDataExchangeService 将接口上的外部方法声明转换为服务对象上的方法调用。 我们可以视为本地服务的类能够引发事件,工作流运行时引擎截获这些事件并将其作为工作流的入站消息加以传送。

下面的代码示例演示如何定义本地工作流通信接口的示例。

[ExternalDataExchange]
public interface ICommunicationService
{
    void HelloHost(string message);
    event EventHandler<ExternalDataEventArgs> HelloWorkflow;
}

服务类

服务类实现用于定义与工作流进行通信的接口。 接口上的所有事件都是单向的,也就是说,这些事件没有 refout 参数,并且没有返回值。 但是,对于传出请求,接口上的方法可以具有 refout 参数,并且有返回值。

通信模型为多对一:有很多工作流实例,每个实例可以使用此单一实例服务对象在很多会话上传递。 这意味着对所有工作流中的特定方法 m 的所有出站调用由同一个对象上的同一个 m 提供服务。

相反,所有入站调用必须显式定向到正确的工作流实例和会话。 Windows Workflow Foundation 为 m 提供一种机制以区别出站调用的工作流实例和会话。 使用这两段信息,对象可以将响应定向回正确的工作流实例上的正确的会话。

Windows Workflow Foundation 在出站调用线程上的 System.Workflow.Runtime.WorkflowEnvironment.WorkflowInstanceId 中提供调用工作流的实例标识符。

下面的代码示例演示通信服务实现。

public class CommunicationService : ICommunicationService 
{
    public event EventHandler<ExternalDataEventArgs> HelloWorkflow;

    public void HelloHost(string message)
    {
        Console.WriteLine("This is the message: {0}", message);

        // Raise the HelloWorkflow event.
        HelloWorkflow(null, new ExternalDataEventArgs(WorkflowEnvironment.WorkflowInstanceId));
    }
}

您启动工作流的实例之前,必须将 ExternalDataExchangeService 添加到工作流运行时引擎,然后将自定义通信服务添加到 ExternalDataExchangeService,如下面的代码示例所示。

ExternalDataExchangeService externalService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalService);
externalService.AddService(new CommunicationService());

若要查看使用本地服务的主机通信的示例,请参见 HostCommunication Sample

请参见

参考

HandleExternalEventActivity
CallExternalMethodActivity

概念

使用 HandleExternalEventActivity 活动
使用 CallExternalMethodActivity 活动
与其他工作流通信
工作流和应用程序通信

其他资源

HostCommunication Sample

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。