通过 WCF 接收适配器发布 WCF 服务时的注意事项

本主题提供在通过 WCF 接收适配器发布 WCF 服务时应当注意的信息。 如果使用 WCF 适配器发布服务,会允许该服务由 WCF 客户端调用,就像该服务是一个典型的 WCF 服务一样。

进程内托管

btsntsvc.exe,在BizTalk Server进程空间内托管接收位置可以简化开发和部署。 此外,它创建的主机实例比在 IIS 中托管的实例多,以利用BizTalk Server的高可用性和负载均衡功能。 有关在 IIS 中BizTalk Server进程外部承载的信息,请参阅为独立 WCF 接收适配器配置 IIS

将 WCF 适配器(WCF-NetMsmq 接收适配器除外)发布的 WCF 服务的 IsOneWay 属性设置为 false

即使对于单向接收位置,使用 WCF 适配器发布的 WCF 服务的 System.ServiceModel.OperationContractAttribute.IsOneWay 属性(使用 WCF-NetMsmq 接收适配器发布的服务 除外)也 设置为 false 。 如果 IsOneWay 属性设置为 false,则返回 void 的方法甚至会导致答复消息。 在此种情况下,基础结构将创建并发送一条空消息,以向调用方指示该方法已返回内容。 使用此方法,基础结构可以向客户端回发服务操作引发的异常。

若要使用随 WCF 适配器 (发布的 WCF 服务,WCF-NetMsmq 接收适配器) IsOneWayfalse,客户端上的 IsOneWay 属性必须设置为 false ,如下所示:

[ServiceContract(Namespace="Microsoft.WCF.Documentation")]
  public interface ISampleService{
    [OperationContract(IsOneWay=false, ReplyAction="*",Action="…"]
    string SampleMethod(string msg);
}

注意

由于 IsOneWay 属性的默认值为 false,因此不必在代码中指定属性。

在使用通过单向接收位置发布的 WCF 服务时,客户端上 OperationContractAttribute 的 ReplyAction 属性应当设置为“*”(星号)

System.ServiceModel.OperationContractAttributeSystem.ServiceModel.OperationContractAttribute.ReplyAction 属性可用于在客户端上指定来自 WCF 服务的响应消息的 SOAP 操作的值。

除了为答复消息的操作头指定特定值以外(以通知客户端这是一个答复,以及要执行的操作),还可以指定字符串“*”(星号)。 在客户端应用程序中指定星号即指示客户端不验证服务所发送的响应消息中的答复操作。

若要使用单向接收位置发布的 WCF 服务,WCF 服务的代理方法必须返回 void,在这种情况下,代理方法预期 WCF 服务将发送一条空消息,以指示该方法已返回的调用方。 要使代理方法接收此空消息,OperationContractAttributeReplyAction 属性应设置为“*” (星号) ,如下所示:

[ServiceContract(Namespace="Microsoft.WCF.Documentation")]
  public interface ISampleService{
    [OperationContract(IsOneWay=false, ReplyAction="*",Action="…"]
    string SampleMethod(string msg);
}

注意

无需将 replyAction 属性设置为“*” (WCF-NetMsmq 适配器的星号) ,因为 WCF-NetMsmq 适配器要求 WCF 客户端将 IsOneWay 属性设置为 true

一个独立主机实例只能运行一个适配器

一个独立主机实例只能运行一个适配器。 如果用一个独立主机配置多个独立适配器(如 HTTP、SOAP 和 WCF 适配器)的接收处理程序,则必须创建多个应用程序池,每个适配器对应一个应用程序池。 有关 BizTalk 独立主机的详细信息,请参阅 启用 Web 服务

在发送 XML 内容作为响应消息时使用“模板 - 由模板指定的内容”选项

具有 正文 -- BizTalk 响应消息正文 (默认值) 选项的 WCF 适配器不允许发送非 XML 消息,如字符数据和位图图像。 可以使用 WCF 适配器的 模板 -- 模板指定的内容 选项来发送非 XML 消息。 有关如何使用模板的详细信息,请参阅 指定 WCF 适配器的消息正文

为通过 WCF 服务发布向导发布的 WCF 服务设置权限

在 Windows Server 2008 SP2 或 Windows Server 2008 R2 平台上使用 WCF 服务发布向导创建的 ASP.NET 应用程序时,可能会出现与在 WCF 服务调用期间访问 DLL 相关的错误。 这些错误通常与默认 Windows Server 2008 SP2 和 Windows Server 2008 R2 安全性的问题有关。 有关这些错误的详细信息,请参阅帮助和支持网站上 https://go.microsoft.com/fwlink/?LinkId=43659名为“客户端应用程序调用 Web 服务时收到”System.IO.FileNotFoundException“的 Microsoft 帮助和支持文章。

BizTalk Server 要求:无论 WCF 服务是在进程内主机上运行还是在独立主机上运行,运行该服务的进程都必须被授予适当的权限。 在 Windows Server 2008 SP2 和 Windows Server 2008 R2 下,独立主机的默认 Windows 组是独立主机用户组,因此,向独立主机用户组添加权限应可解决此问题。

为 Isolated Host Users 组添加权限

  1. 在 Microsoft Windows 资源管理器中,找到 %windir%\temp 目录。

  2. 右键单击 %windir%\temp,然后单击“ 属性”。

  3. “属性 ”对话框中,单击“ 安全性 ”选项卡。

  4. 单击“ 添加”,选择“ 独立主机用户组”,然后单击“ 确定”。

为带有 WCF-NetMsmq 适配器的 WCF 接收位置设置权限

当使用 NetMsmqBinding 的 WCF 客户端向通过 WCF-NetMsmq 适配器发布的 WCF 服务发送消息时,它会将消息发送到目标队列(也就是由服务的队列管理器管理的队列)。 客户端上的队列管理器将消息发送至传输(或传出)队列。 传输队列是客户端队列管理器上的一个队列,用来存储要传输到目标队列的消息。

服务的队列管理器接受发送到它所拥有的目标队列的消息,并存储这些消息。 然后,服务会请求从目标队列读取消息,而队列管理器会将这些消息传送给该服务。 因此,承载接收位置的 BizTalk 主机实例的服务帐户应当具有从目标队列进行读取的权限。

使用空的正文路径表达式接收在 SOAP Body 元素内容中有字符数据的 SOAP 消息

若要使 WCF 接收适配器从传入响应消息创建 BizTalk 消息,其中包含 SOAP Body 元素内容中的字符数据,如以下示例所示,应在 WCF 适配器传输属性对话框中的“消息”选项卡上将“正文路径表达式”文本框留空。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
      ...
    </s:Header>
    <s:Body>Contoso</s:Body>
</s:Envelope>

如果选择“ 信封 ”或“ 正文 ”选项,则适配器无法从上一个传入消息创建 BizTalk 消息。 该消息不会挂起,因为在入站 SOAP 封送处理中失败的消息不会挂起。 有关如何使用“ 消息 ”选项卡上的正文路径表达式的详细信息,请参阅 为 WCF 适配器指定消息正文

注意

可以通过配置 BTSNTSvc.exe.config 文件来使用 Windows SDK 中的 TraceViewer 工具 (SvcTraceViewer.exe)。 有关 Windows SDK 的详细信息,请参阅 上的 https://go.microsoft.com/fwlink/?LinkId=75219“Windows SDK 中的新增功能”。 有关 TraceViewer 工具的详细信息,请参阅 中的 https://go.microsoft.com/fwlink/?LinkId=75218“TraceViewer 工具 (SvcTraceViewer.exe) ”。

使用引用其他架构的架构

当架构变得庞大和复杂时,或者表示不同类型的实例消息的架构具有某些共同部分时,可以使用 重新定义包含导入 元素。 可能有必要将较小的架构组合成新的架构,这个新的架构可以最终定义要与贸易合作伙伴进行交换的实例消息的结构。 可使用 BizTalk WCF 服务发布向导将这些架构发布为 WCF 服务。

应当使用 BizTalk WCF 服务使用向导创建从 BizTalk 项目使用 WCF 服务所必需的 BizTalk 项目。 如果要从 .NET 应用程序使用 WCF 服务,应当使用服务模型元数据实用工具 (Svcutil.exe) 为 WCF 服务创建代理类。 有关如何使用引用其他架构的架构的详细信息,请参阅 使用其他架构的架构如何创建使用其他架构的架构。 有关 Svcutil.exe 的详细信息,请参阅 中的 https://go.microsoft.com/fwlink/?LinkID=74696“服务模型元数据实用工具 (Svcutil.exe) ”。

下表显示了在使用已发布的、其架构使用其他架构的 WCF 服务时,需要了解的限制和注意事项。

XML 架构元素 使用通过 BizTalk WCF 服务发布向导发布的 WCF 服务 使用由 .NET 应用程序承载的 WCF 服务
<import> BizTalk WCF 服务使用向导和 Svcutil.exe 均支持 BizTalk WCF 服务使用向导和 Svcutil.exe 均支持
<include> BizTalk WCF 服务使用向导和 Svcutil.exe 支持 注意: 创建代理类时,Svcutil.exe 可能会引发警告消息。 BizTalk WCF 服务使用向导和 Svcutil.exe 支持 注意: 创建代理类时,Svcutil.exe 可能会引发警告消息。
<redefine> - 受 BizTalk WCF 服务使用向导支持
- 由 Svcutil.exe 提供有限支持 注意: Svcutil.exe 对 重新定义 元素的限制与 XSD.exe 相同。
BizTalk WCF 服务使用向导和 Svcutil.exe 支持 注意: 创建代理类时,Svcutil.exe 可能会引发警告消息。

注意

Svcutil.exe 在使用 include重新定义 元素的架构针对已发布的 BizTalk WCF 服务创建代理类时,可能会引发警告消息。 例如,“The global element has already been declared.”(此全局元素已声明。)

在更改了服务终结点地址中的计算机名部分之后,请确保相应的进程内 WCF 接收位置未被禁用。

如果在正在运行的进程内 WCF 接收位置的“地址 (URI) ”文本框中更改计算机名称部分,建议使用 BizTalk 管理控制台检查接收位置是否仍在运行。 例如,如果使用 WCF-NetTcp 接收适配器 net.tcp://<Your Computer Name>/samplepath 将服务终结点地址更改为 net.tcp://localhost/samplepath,则接收位置可能会禁用 Service.InvalidOperationException。 如果只更改服务终结点地址中的计算机名部分,而不修改路径部分,则请确保接收位置未被禁用,如有必要请启用它。

在通过事务协议与远程 WCF 接收位置进行通信的客户端计算机上设置相应的 MSDTC 安全配置选项

WCF-NetTcp、WCF-WSHttp 和 WCF-NetNamedPipe 接收适配器可以参与 WCF 客户端使用 WS-AtomicTransactionOleTransaction 事务协议管理的事务协调过程。 可以在事务性上下文中使用事务协议将消息传输到目标接收位置并将其从 MessageBox 数据库中删除。

若要使用事务协议与远程 WCF 接收位置通信,必须在 WCF 客户端计算机上适当配置 MSDTC 安全配置 选项。 下表列出了 MSDTC 安全配置 对话框中可用选项的必需值:

配置选项 默认值 建议的值
网络 DTC 访问 已禁用 已启用
允许出站 已禁用 已启用
要求进行相互身份验证 已启用 如果相应的远程接收位置正在运行 Windows Server 2003 SP1 或 SP2,并且配置为 “需要相互身份验证”,则启用。
要求对呼叫方进行身份验证 已禁用 如果在群集上运行 MSDTC,则启用。

在应用这些更改之后,必须重新启动 MSDTC 服务。

若要访问“MSDTC 安全配置 ”对话框,请执行以下步骤:

  1. 单击 “开始”,单击“ 运行”,然后键入 dcomcnfg 以启动 组件服务 管理控制台。

  2. 展开 “组件服务”,展开“ 计算机”,右键单击“ 我的计算机”,然后单击“ 属性”。

  3. 在“ 我的计算机属性 ”对话框中,单击“ MSDTC ”选项卡,然后单击“ 安全配置 ”以显示“ 安全配置 ”对话框。

使用 BizTalk WCF 服务发布向导时 SOAP 包装的说明

使用 WCF 服务发布向导将业务流程公开为 Windows Communication Foundation (WCF) 服务时,将生成包装器。 包装将使用消息发送到的 XML 消息端口的方法名称。 此包装是 Microsoft SOAP 信封的默认值。 它允许 WCF 将多部分 SOAP 消息包装在一个 WCF 消息中,以便适配器传输到终结点。

最佳做法是发送方应使用包装器,接收方应使用包装器,或者发送方不应使用包装器,接收方应预期原始 WCF 消息。 无法提前预知使用包装是否会导致发送和接收内容之间的不兼容问题。