WCF 适配器的已知问题

本主题介绍BizTalk Server附带的 WCF 适配器的已知问题。

在入站 SOAP 封送处理中失败的消息不会在 WCF 接收适配器中挂起

在消息到达 WCF 接收适配器时,WCF 适配器将从传入的 SOAP 消息创建 BizTalk 消息,然后将 BizTalk 消息传递到由终结点管理器管理的传输代理。 如果创建 BizTalk 消息时该适配器无法读取 SOAP 信封和正文,则消息不会挂起,因为该适配器使用快速、非缓存的只进读取器来访问 SOAP 消息。

您应该检查事件日志中的失败消息。 例如,可以使用 WCF 适配器传输属性对话框中“ 消息 ”选项卡上的正文路径表达式来指定如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 在“ 消息 ”选项卡上提供传入 SOAP 消息的无效正文路径表达式时,适配器无法创建 BizTalk 消息,并且无法挂起传入消息。 有关如何在“ 消息 ”选项卡上使用正文路径表达式的详细信息,请参阅 指定 WCF 适配器的消息正文

下图显示了“ 消息 ”选项卡,可在其中指定如何从传入的 SOAP 消息创建入站 BizTalk 消息。

在入站 SOAP 封送处理中失败的消息不会在 WCF 发送适配器中挂起

要求-响应 WCF 发送端口可以接收 WCF 消息作为响应消息。 当消息到达 WCF 发送适配器时,WCF 适配器将从传入的 SOAP 消息创建 BizTalk 消息,然后将 BizTalk 消息传递到由终结点管理器管理的传输代理。 如果创建 BizTalk 消息时该适配器无法读取 SOAP 信封和正文,则消息不会挂起,因为该适配器使用快速、非缓存的只进读取器来访问 SOAP 消息。

您应该检查事件日志中的失败消息。 例如,可以使用 WCF 适配器传输属性对话框中“ 消息 ”选项卡上的 XPath 表达式来指定如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 在“ 消息 ”选项卡上提供传入 SOAP 消息的无效 XPath 表达式时,适配器无法创建 BizTalk 消息,并且无法挂起传入消息。 有关如何使用“ 消息 ”选项卡上的 XPath 表达式的详细信息,请参阅 指定 WCF 适配器的消息正文

下图显示了 WCF-NetNamedPipe 发送适配器的“ 消息 ”选项卡作为示例。

WCF 发送适配器

如果在非事务性 WCF 接收位置将双向传输中的 OneWayBindingElement 用于自定义绑定,则消息可能会丢失

在双向通信中,WCF 适配器将发送回响应,直到消息已保存在 MessageBox 数据库中。 但是,使用 OneWayBindingElement 会立即生成虚拟响应,然后再将收到的消息调度到 WCF 适配器。 因此,如果在通道堆栈中使用 OneWayBindingElement 配置自定义绑定,以便在非事务接收位置进行双向传输,则消息可能会丢失,因为 WCF 适配器以单向方式处理收到的消息。

构造绑定时,将使用“WCF-Custom 传输属性”和“WCF-CustomIsolated 传输属性”对话框中 ReaderQuotas 属性的默认值

在“WCF-Custom 和 WCF-CustomIsolated 传输属性”对话框中, ReaderQuotas 属性值显示为零。 然而,构造绑定时,将使用以下值:

Attribute 说明
maxArrayLength 正整数,指定允许的最大数组长度。 16384
maxBytesPerRead 正整数,指定允许每次读取时返回的最大字节数。 4096
maxDepth 正整数,指定每次读取的最大嵌套节点深度。 32
maxNameTableCharCount 正整数,指定表名称中允许的最大字符数。 16384
maxStringContentLength 正整数,指定 XML 元素内容中允许的最大字符数。 8192

如果更改 WCF 适配器类型并保持相同的地址,则可能会禁用 WCF 接收位置

如果更改适配器类型(例如,将 WCF 适配器类型从 WCF-NetTcp 更改为使用 NetTcp 绑定 WCF-Custom)并保留相同的地址,则可能会因为 Endpoint Manager 中的缓存问题而禁用接收位置。 若要解决此问题,您可以执行以下操作之一:

  • 重新启动 BTSNTSvc 服务。

  • 将 URI 更改为其他地址并保存,然后将 URI 改回原始地址并再次保存。

业务流程中设置的 WCF 操作不会重写静态发送端口中的操作设置

如果设置 WCF。 业务流程中的操作上下文属性,需要在 WCF 适配器传输属性对话框中将 “操作” 字段留空。 如果还指定静态发送端口中的操作,则 为 WCF。 在业务流程中设置的操作上下文属性将被你在静态发送端口中设置的值重写。

事务性发送中不支持传播错误消息

通过请求-响应发送端口中的 “传播错误消息 ”选项,可以将出站处理失败的消息路由到订阅应用程序。 但是,如果在传输属性对话框中也选中了“启用事务检查”框,并且当错误响应到达适配器时事务已中止或不可用,则无法将错误消息传播到任何订阅应用程序

在群集故障转移期间,需要先重新启动 MSMQ 群集资源组,然后再重新启动 BizTalk 主机群集资源组

在故障转移群集方案中,如果发生故障转移,则需要先重新启动 MSMQ 群集资源组,然后再重新启动 BizTalk 主机群集资源组。 如果没有这样做,则可能会禁用 MSMQ 接收位置。 若要解决此问题,您可以使 BizTalk 主机群集资源组依赖于 MSMQ 群集资源组,以确保 MSMQ 群集资源组在 BizTalk 主机群集资源组之前启动。 或者,您可以重新启动 BizTalk 主机群集资源组来解决此问题。

将消息发送到在终结点中使用 wsFederationHttpBinding 的 WCF 服务时收到错误

您会收到类似如下的错误:

The adapter failed to transmit message going to send port "MySendPort" with URL "http://localohost/MywsFedHttp". It will be retransmitted after the retry interval specified for this Send Port. Details:"The channel is configured to use interactive initializer 'System.ServiceModel.Security.InfocardInteractiveChannelInitializer', but the channel was Opened without calling DisplayInitializationUI.  Call DisplayInitializationUI before calling Open or other methods on this channel.".

此行为是设计使然。 WCF 适配器无法将消息发送到在其终结点中使用 wsFederationHttpBinding 的 WCF 服务。

使用 BizTalk WCF 服务使用向导不能从 WSDL 选择消息类型或端口类型

导入 WCF 服务时,使用 BizTalk WCF 服务使用向导不能从 WSDL 选择消息类型或端口类型。 若要消除此限制,您可以使用以下代码获取架构,然后将所需架构添加到 BizTalk 项目:

svcutil.exe /t:metadata http://service/metadataendpoint

BizTalk WCF 服务使用向导不允许单向操作和请求响应操作组合

BizTalk WCF 服务使用向导不允许导入具有单向操作和请求响应操作组合的端口类型。 若要解决此问题,您可以使用 ServiceModel 元数据实用工具生成端口类型。

BizTalk WCF 服务使用向导不允许在检索 WSDL 时设置证书凭据

BizTalk WCF 服务使用向导不允许在检索 WSDL 时设置证书凭据。 若要解决此问题,可以使用 ServiceModel 元数据实用工具从要与 svcutil.exe.config 文件中设置的证书凭据一起使用的 WCF 服务生成 WSDL 和 XSD 文件,然后在“元数据源”页中选择“元数据文件 (WSDL 和 XSD) ”选项,将它们导入 BizTalk WCF 服务使用向导。

WCF 适配器不支持单向操作

使用随 WCF 适配器 (发布的 WCF 服务(WCF-NetMsmq 接收适配器) 如果在客户端将 IsOneWay 属性设置为 true ,则会收到类似于以下内容的错误消息。 这是因为使用 WCF 适配器发布的 WCF 服务的 System.ServiceModel.OperationContractAttribute.IsOneWay 属性 ((使用 WCF-NetMsmq 接收适配器发布的服务除外) 设置为 false ,即使对于单向接收位置也是如此。

The channel received an unexpected input message while closing. Your Channel.Close() calls are not synchronized.

使用 IsOneWay 属性设置为 true 指定的 WCF 服务时,将收到类似于以下内容的错误消息。 从 BizTalk Server 发送的消息将暂停并恢复。

The request operation at net.tcp://localhost:8088/MyService/tcp did not receive a reply within timeout 00:01:00.

在使用 WCF-NetMsmq 绑定将消息发送到非事务性 MSMQ 队列时,可能发生内存泄漏

在使用 WCF-NetMsmq 绑定将消息发送到非事务性 MSMQ 队列时,BizTalk NT 服务中可能发生内存泄漏。 在使用 WCF-NetMsmq 传输将消息发送到非事务性 MSMQ 队列,或者通过将 netMsmqBinding 与 WCF-Custom 传输一起使用,将消息发送到非事务性 MSMQ 队列时,可能发生这种问题。

若要解决此问题,必须安装 .NET Framework 3.0 修补程序,如 知识库文章936512中所述。https://go.microsoft.com/fwlink/?LinkId=92962 该修补程序不要求重新启动系统,但需要重新启动承载使用 WCF-NetMsmq 绑定的发送端口的 BizTalk NT 服务。

如果使用 WCF-BasicHttp 适配器与 Apache Web 服务器进行通信,则可能会发生异常

如果将 WCF-BasicHttp 适配器与传输安全性一起使用来与 Apache Web 服务器进行通信,则可能会发生类似如下的异常:

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine

若要解决此问题,您需要使用 WCF-Custom 适配器(而非 WCF-BasicHttp 适配器)与 Apache Web 服务器进行通信,如下所示:

  1. 创建发送端口并将传输类型设置为 WCF-Custom

  2. “WCF 自定义传输属性”对话框中的“绑定”选项卡上,从“绑定类型”下拉列表中选择“customBinding”。

  3. CustomeBindingElement 下,右键单击“ httpTransport”,然后单击“ 删除扩展”。

  4. 右键单击 CustomeBindingElement,然后单击 “添加扩展”。

  5. “选择绑定元素扩展 ”对话框中,选择“ httpTransport ”,然后单击“ 确定”。

  6. 单击“ httpTransport”,然后在“ 配置 ”窗格中,将 keepAliveEnabled 的值设置为 False

  7. 单击“ textMessageEncoding”,然后在“ 配置 ”窗格中,将 messageVersion 的值设置为 Soap11WSAddressing10

  8. 可以根据需要配置其他属性。

BizTalk Server 无法将使用 ClientViaBehavior 的 WCF 客户端用于多跃点会话

当直接网络目标不是消息的预期处理器,且调用应用程序无需了解最终目标时,WCF 客户端会使用 ClientViaBehavior 启用多跃点会话。 如果指定 ClientViaBehavior 并将“收件人”地址设置为远程服务(其中 BizTalk Server 将充当桥梁),您将收到类似如下的错误消息:

The message with To 'net.tcp://localhost:5555/test.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree