本主题介绍 BizTalk Server 随附的 WCF 适配器的已知问题。
WCF 接收适配器中入站 SOAP 封送处理失败的消息不会挂起
当消息到达 WCF 接收适配器时,WCF 适配器会从传入的 SOAP 消息创建 BizTalk 消息,然后将 BizTalk 消息传递给由 Endpoint Manager 管理的传输代理。 如果在创建 BizTalk 消息时适配器无法读取 SOAP 信封和正文,则不会挂起该消息,因为适配器使用快速、非缓存和仅转发读取器来访问 SOAP 消息。
应检查事件日志中是否存在失败的消息。 例如,可以在 WCF 适配器传输属性对话框中的“ 消息 ”选项卡上使用正文路径表达式来指定如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 在“ 消息 ”选项卡上提供传入 SOAP 消息的无效正文路径表达式时,适配器无法创建 BizTalk 消息,并且无法挂起传入消息。 有关如何在 “消息 ”选项卡上使用正文路径表达式的详细信息,请参阅 为 WCF 适配器指定消息正文。
下图显示了“ 消息 ”选项卡,可以指定如何从传入 SOAP 消息创建入站 BizTalk 消息。
在 WCF 发送适配器中,对于在入站 SOAP 封送处理过程中失败的消息不会暂停处理。
请求响应 WCF 发送端口可以作为响应消息接收 WCF 消息。 当消息到达 WCF 发送适配器时,WCF 适配器会从传入的 SOAP 消息创建 BizTalk 消息,然后将 BizTalk 消息传递给由 Endpoint Manager 管理的传输代理。 如果在创建 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 属性值显示为零。 但是,在构造绑定时,使用以下值:
| 特征 | DESCRIPTION | 价值 |
|---|---|---|
| 最大数组长度 | 一个正整数,指定允许的最大数组长度。 | 16384 |
| maxBytesPerRead | 一个正整数,指定每个读取返回的最大允许字节数。 | 4096 |
| 最大深度 | 一个正整数,指定每个读取的最大嵌套节点深度。 | 32 |
| maxNameTableCharCount | 一个正整数,指定表名中允许的最大字符数。 | 16384 |
| maxStringContentLength | 一个正整数,指定 XML 元素内容中允许的最大字符。 | 8192 |
如果更改 WCF 适配器类型并保留相同的地址,则可以禁用 WCF 接收位置
如果更改适配器类型(例如,将 WCF 适配器类型从 WCF-NetTcp 更改为使用 NetTcp 绑定 WCF-Custom),并且保留相同的地址,则由于 Endpoint Manager 中的缓存问题,可能会禁用接收位置。 若要解决此问题,可以执行以下作之一:
重启 BTSNTSvc 服务。
将 URI 更改为其他地址并保存,然后将 URI 更改回原始地址,然后再次保存。
业务流程中的 WCF 操作集不会覆盖静态发送端口中的操作设置。
如果在业务流程中设置了 WCF.Action 上下文属性,那么需要在 WCF 适配器传输属性对话框中将 Action 字段留空。 如果您还在静态发送端口中指定一个动作,那么在业务流程中设置的 WCF.Action 上下文属性将被静态发送端口中设置的值覆盖。
在事务性发送中不支持传递故障信息
请求响应发送端口中的 “传播错误消息 ”选项允许将出站处理失败的消息路由到订阅应用程序。 但是,如果在传输属性对话框中也选中了 “启用事务 ”复选框,并且当故障响应到达适配器时,事务中止或不可用,则无法将错误消息传播到任何订阅应用程序
在群集故障转移期间重启 BizTalk 主机群集资源组之前,需要重启 MSMQ 群集资源组
在故障转移群集方案中,发生故障转移时,需要在重启 BizTalk 主机群集资源组之前重启 MSMQ 群集资源组。 如果您未能这样做,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 中选择消息类型或端口类型
BizTalk WCF 服务使用向导不允许在导入 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 属性指定的 WCF 服务设置为 true 时,将收到如下所示的错误消息。 从 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 队列,或者使用具有 WCF-Custom 传输的 netMsmqBinding 将消息发送到非事务性 MSMQ 队列,则可能会出现这种情况。
若要解决此问题,必须安装知识库文章936512 https://go.microsoft.com/fwlink/?LinkId=92962中所述的 .NET Framework 3.0 修补程序。 修补程序不需要系统重启,但需要重启 BizTalk NT 服务,该服务承载使用 WCF-NetMsmq 绑定的发送端口。
使用 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 服务器通信,如下所示:
创建发送端口并将传输类型设置为 WCF-Custom。
在“WCF-Custom 传输属性”对话框中的“绑定”选项卡上,从“绑定类型”下拉列表中选择 customBinding。
在 CustomeBindingElement 下,右键单击 httpTransport,然后单击“ 删除扩展”。
右键单击 CustomeBindingElement,然后单击“ 添加扩展”。
在 “选择绑定元素扩展 ”对话框中,选择 httpTransport ,然后单击“ 确定”。
单击 httpTransport,然后在 “配置 ”窗格中,将 keepAliveEnabled 的值设置为 False。
单击 textMessageEncoding,然后在 “配置 ”窗格中,将 messageVersion 的值设置为
Soap11WSAddressing10。可能需要根据需要配置其他属性。
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