使用 SendActivity 活动
一种服务使用 Windows Communication Foundation (WCF),该服务实现一个协定,根据这个协定又定义一种客户端同步操作调用,SendActivity 活动就是用于对这种调用进行建模。
生成服务协定的代码
若要在工作流中使用 SendActivity 活动,则需要协定接口和与这些协定关联的终结点的客户端配置。使用 Svcutil.exe 命令行工具就是实现这一点的一种方法。例如,如果运行服务时可发现的终结点位于 https://localhost:8888/MyService.svc,则可以使用以下语法生成 SendActivity 活动所需的必要代码:
svcutil.exe https://localhost:8888/MyService.svc
Svcutil.exe 工具将生成应用程序配置文件,此配置文件可用于定义使用服务时所需的特定终结点和绑定的应用程序中。所生成的第二个文件包含代理类和实际协定接口。SendActivity 活动需要协定定义才能发现服务。应该将这两个文件添加到工作流项目,以使 SendActivity 活动可以使用这两个文件中的信息。
如果有权访问协定接口,则可以将这些协定接口直接添加到项目,而不必使用 Svcutil.exe 工具,同时也能确保在应用程序配置文件中添加正确的客户端终结点配置。
调用服务方法
SendActivity 活动需要以下信息才能成功连接到服务协定上的操作并调用这些操作:ChannelToken 和操作信息。
指定 SendActivity 活动的 ChannelToken
WCF 终结点包含有关协定名称、协定绑定、安全信息和地址的信息。可以在应用程序配置文件中输入这些信息,也可以使用上一节所提及的 Svcutil.exe 工具生成这些信息。例如,对于侦听地址 https://localhost:8888/MyService.svc 的服务,应用程序配置文件中的客户端节点将如下所示:
<client>
<endpoint address="https://localhost:8888/MyService.svc"
binding="customBinding" bindingConfiguration="WSHttpContextBinding_MyServiceContract"
contract="MyService.localhost.MyServiceContract"
name="WSHttpContextBinding_MyServiceContract">
<identity>
<userPrincipalName value="someone@example.com" />
</identity>
</endpoint>
</client>
创建 SendActivity 活动后,创建 ChannelToken 对象,此对象通过设置 System.Workflow.Activities.ChannelToken.Name 指定通道名称,通过设置 System.Workflow.Activities.ChannelToken.OwnerActivityName 指定通道的范围,并通过设置 ChannelToken 对象的 System.Workflow.Activities.ChannelToken.EndpointName 属性设置客户端终结点。然后使用 ChannelToken 属性将 ChannelToken 对象与 SendActivity 实例相关联。以下代码显示如何创建 SendActivity 活动和 ChannelToken 对象,还显示如何使用前面所述的应用程序配置中的信息将 ChannelToken 与 SendActivity 活动相关联。
SendActivity sendActivity1 = new SendActivity();
ChannelToken channel1 = new ChannelToken();
channel1.EndpointName = "WSHttpContextBinding_MyServiceContract";
channel1.Name = "WSHttpContextBinding_MyServiceContract";
channel1.OwnerActivityName = "Workflow1";
this.sendActivity1.ChannelToken = channel1;
this.sendActivity1.Name = "sendActivity1";
指定 SendActivity Activity 的操作信息
SendActivity 活动只调用一个协定中定义的一个操作。为此,SendActivity 使用 TypedOperationInfo 对象,该对象包含有关协定的数据类型以及要调用的操作名称的信息。TypedOperationInfo 类的 ContractType 属性指的是协定接口类型。通过 TypedOperationInfo 类所访问的 Name 属性指的是在该类型中要调用的操作的名称。
System.Workflow.Activities.TypedOperationInfo typedoperationinfo1 = new System.Workflow.Activities.TypedOperationInfo();
typedoperationinfo1.ContractType = typeof(MyServiceContractClient.localhost.MyServiceContract);
typedoperationinfo1.Name = "DoWork";
typedoperationinfo1.PrincipalPermissionName = "";
typedoperationinfo1.PrincipalPermissionRole = "";
this.sendActivity1.ServiceOperationInfo = typedoperationinfo1;
另请参见
任务
参考
SendActivity
TypedOperationInfo
ServiceOperationInfo
ChannelToken
概念
使用 ReceiveActivity 活动
工作流服务创作样式
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。