工作流服务是使用工作流实现的基于 WCF 的服务。 工作流服务是使用消息传送活动发送和接收 Windows Communication Foundation (WCF) 消息的工作流。 .NET Framework 4.5 引入了许多消息传递活动,允许从工作流中发送和接收消息。 有关消息传递活动以及如何用于实现不同消息交换模式的详细信息,请参阅 消息传送活动。
使用工作流服务的好处
随着应用程序日益分散,各个服务负责调用其他服务来卸载某些工作。 作为异步作实现这些调用会给代码带来一些复杂性。 错误处理以处理异常和提供详细的跟踪信息的形式增加了额外的复杂性。 某些服务通常运行时间较长,在等待输入时可能会占用宝贵的系统资源。 由于这些问题,分布式应用程序通常非常复杂,难以编写和维护。 工作流是表达异步工作的协调的自然方式,尤其是对外部服务的调用。 工作流在表示长时间运行的业务流程时也有效。 正是这些品质使工作流成为在分布式环境中构建服务的绝佳资产。
实现工作流服务
实现 WCF 服务时,可以定义一些协定来描述该服务及其发送和接收的数据。 数据表示为数据协定和消息协定。 WCF 和工作流服务都使用数据协定和消息协定定义作为服务说明的一部分。 服务本身公开元数据(以 WSDL 的形式)来描述服务的操作。 在 WCF 中,服务约定和操作约定定义服务及其支持的操作。 但在工作流服务中,这些合同是业务流程本身的一部分。 它们通过称为合同推理的过程在元数据中显现。 使用 WorkflowServiceHost工作流服务托管时,将检查工作流定义,并根据工作流中找到的消息活动集生成协定。 具体而言,以下活动和属性用于生成协定:
Receive 活动
SendReply 活动
契约推论的最终结果是使用与 WCF 服务和操作契约相同的数据结构来描述服务。 然后,将使用此信息对工作流服务公开 WSDL。
注释
.NET Framework 4.6.1 不允许使用现有协定定义编写工作流服务,而无需提供一些额外的工具支持。 工作流服务协定由前面讨论的协定推理过程创建。 不过,消息协定和数据协定完全受到支持。
工作流服务和基于 MSMQ 的绑定
WCF 定义两个基于 MSMQ 的 NetMsmqBinding 绑定和 MsmqIntegrationBinding。 基于 MSMQ 的绑定通常与工作流服务一起使用,因为这些服务具有长期运行特性。 基于 MSMQ 的绑定具有一个 ValidityDuration
属性,该属性指定 MSMQ 消息的有效期。 由于工作流服务具有长期运行的特性,MSMQ 消息的有效期可能会在工作流服务处理之前过期。 因此,将 MSMQ 绑定的有效性持续时间设置为适当的值非常重要。 必须根据工作流及其处理消息的方式选择此值。 例如,如果你有一个带有 Receive 活动的工作流,后面是一个需要运行10分钟的自定义活动,然后是另一个 Receive 活动,则 ValidityDuration
的正确值应大于 10 分钟。
托管工作流服务
与 WCF 服务一样,必须托管工作流服务。 WCF 服务使用 ServiceHost 类来托管服务,而工作流服务使用 WorkflowServiceHost 来托管服务。 与 WCF 服务一样,可以通过多种方式托管工作流服务,例如:
在托管的 .NET Framework 应用程序中。
在 Internet Information Services (IIS) 中。
在 Windows 进程激活服务(WAS) 中。
在托管的 Windows 服务中。
托管于 .NET Framework 应用程序或托管 Windows 服务中的工作流服务会创建WorkflowServiceHost类的一个实例,并将包含工作流定义的WorkflowService实例的Body属性传递给它。 包含消息活动的工作流定义作为工作流服务公开。
若要在 IIS 或 WAS 中托管工作流服务,请将包含工作流服务定义的 .xamlx 文件放入虚拟目录中。 默认终结点(使用 BasicHttpBinding)会自动创建。有关详细信息,请参阅 简化的配置。 还可以将 Web.config 文件放置在虚拟目录中以指定自己的终结点。 如果工作流定义位于程序集中,则可以将 .svc 文件放置在虚拟目录中,并将工作流程序集放置在App_Code目录中。 .svc 文件必须指定服务主机工厂和实现工作流服务的类。 以下示例演示如何指定服务主机工厂并指定实现工作流服务的类。
<%@ServiceHost Factory="System.ServiceModel.Activities.Activation.WorkflowServiceHostFactory"
Service="EchoService"%>