本部分讨论如何使用故障排除技术来解决在使用适用于 SQL Server 的 Microsoft BizTalk 适配器时可能遇到的操作错误。
启用跟踪
必须在适配器、WCF LOB 适配器 SDK 和 SQL Server 之间启用跟踪,以便收集有关使用 SQL 适配器时遇到的任何问题的详细信息。 有关 SQL 适配器中的跟踪支持的详细信息,请参阅 SQL 适配器中的诊断跟踪和消息日志记录。
已知问题
以下是使用 SQL 适配器时可能会遇到的最常见错误及其可能的原因和解决方法。
加载适配器绑定时出错
问题
尝试启动“添加适配器服务引用 Visual Studio 插件”或“使用适配器服务 BizTalk 项目外接程序”时,会收到以下错误:
There was an error loading the binding, <binding name>, from your system configuration.
ConfigurationErrorsException: Exception has been thrown by the target of an invocation.
原因
尝试启动“添加适配器服务引用插件”或“使用适配器服务插件”时,WCF 会加载所有已安装适配器的适配器绑定。 反过来,适配器绑定依赖于企业应用程序的特定客户端软件。 如果您执行了典型安装或完整安装并安装了适配器包,这可能会导致您遇到此问题,该安装将包括 BizTalk 适配器包中所有的适配器。 但是,只能为一个企业应用程序安装 LOB 客户端库。 因此,GUI 无法加载其他适配器的绑定。
解决方案
请确保执行适配器的自定义安装,以便仅安装所需的适配器。
SQL 适配器不显示在 BizTalk Server 管理控制台中的适配器列表中
问题
与 BizTalk Server 随附的适配器的早期版本不同,BizTalk 适配器包随附的 SQL 适配器不会显示在 BizTalk Server 管理控制台中的适配器列表中。
原因
最新的 SQL 适配器是 WCF 自定义绑定。 因此,尽管 BizTalk Server 管理控制台显示 WCF-Custom 适配器,但它不显示 WCF 自定义绑定,因此不会显示基于 WCF 的 SQL 适配器。
解决方案
可以按照将 SQL 适配器添加到 BizTalk Server 管理控制台中所述的步骤,将 SQL 适配器显式添加到 BizTalk Server 管理控制台。
对 SQL Server 数据库执行作时出错
问题
使用 BizTalk Server 对 SQL Server 数据库执行任何作时,适配器会提供以下错误。
对于 BizTalk Server
System.ArgumentNullException: Value cannot be null.
原因
未指定消息的 WCF 操作。 WCF 要求为每个操作指定一个 SOAP 操作,该操作通知适配器要对 LOB 系统执行的操作。
解决方案
在发送端口中指定 SOAP 操作,或在 BizTalk 流程中将其作为消息上下文属性。 有关说明,请参阅 配置 SQL 适配器的 SOAP 操作。 请参阅 消息和消息架构,查看每个操作的动作列表。
执行 FILESTREAM 操作时,出现 ErrorCode=5 的 InvalidOperationException
问题
使用 SQL 适配器执行 FILESTREAM作时,会出现以下错误。
System.InvalidOperationException: OpenSqlFileStream returned error.
ErrorCode:5
原因
你可能具有连接到 SQL Server 数据库的指定数据库凭据。 若要执行 FILESTREAM 操作,必须始终使用 Windows 身份验证。 错误代码“5”表示由于凭据不正确而拒绝访问。 有关不同错误代码的详细信息,请参阅系统错误代码(0-499)。
解决方案
使用 Windows 身份验证连接到 SQL Server 数据库。 在 BizTalk Server 管理控制台中,可以通过在 WCF-Custom 或 WCF-SQL 端口配置对话框中将用户名和密码字段留空来执行此作。
即使为 PollingStatement 和 PolledDataAvailableStatement 指定了有效语句,轮询操作也不会返回任何消息。
问题
即使为 PollingStatement 和 PolledDataAvailableStatement 绑定属性指定了有效值,适配器也不会从 SQL Server 接收轮询消息。
原因
验证是否有其他事务在适配器正在轮询的表上加锁。
解决方案
如果要轮询作为另一个事务的一部分正在更新的表,可以考虑在 PolledDataAvailableStatement 绑定属性中指定的查询中使用 "with (nolock)" 参数,以确保即使其他事务施加了锁定,也会返回数据。 有关详细信息,请参阅 数据库引擎中的 SQL 锁定。
适配器无法使用 BizTalk Server 在单个操作中插入、更新或删除大量数据。
问题
SQL 适配器无法通过 BizTalk Server 在单个操作中对大量数据进行插入、更新或删除。
原因
插入、更新或删除大量的数据可能需要一段时间,执行该操作的 SQL 适配器或事务可能会超时。
解决方案
对于 BizTalk Server
在 machine.config中指定 WCF 适配器的超时。导航到 <系统驱动器>:\WINDOWS\Microsoft.NET\Framework\<version>\CONFIG 下的 machine.config 文件,并添加如下所示的摘录。
<configuration> <system.transactions> <machineSettings maxTimeout="02:00:00" /> </system.transactions> </configuration>
使用此设置,WCF 适配器超时设置为 2 小时。
在 machine.config中指定 MSDTC 事务的超时设置。导航到 <系统驱动器>:\WINDOWS\Microsoft.NET\Framework\<version>\CONFIG 下的 machine.config 文件,并添加如下所示的摘录。
<system.transactions> <defaultSettings distributedTransactionManagerName="<computer_name>" timeout="02:00:00"/> </system.transactions>
使用该设置,MSDTC 的超时时间被设定为 2 小时。 MSDTC 超时的默认值为 10 分钟。
重要
必须在运行适配器客户端和 SQL Server 的计算机上进行此更改。 在摘录中,将computer_name>替换为<运行适配器客户端和 SQL Server 的计算机的名称。
将 SQL 适配器的 SendTimeout 绑定属性设置为相当大的值。 有关如何设置绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性。
BizTalk Server 中包含 DataSet 的响应消息的完整架构验证失败
问题
对于返回包含 DataSet 的响应消息的操作(例如 ExecuteReader),BizTalk Server 中的完整性架构验证会失败。
解决方案
建议不要对包含数据集的响应消息执行完整的架构验证。 相反,您可以执行以下操作:
执行操作,获取带有架构的响应消息。
将架构从响应消息复制到 .xsd 文件,并将此文件添加到 BizTalk 项目。
在业务流程中使用 xpath 查询从响应消息中提取数据。
BizTalk 项目中的 RootNode TypeName 错误
问题
在 Visual Studio 中的一个 BizTalk 项目中,如果从"使用适配器服务"附加组件生成的架构包含 RootNode TypeName 属性的无效字符或保留字,那么在编译项目时会发生以下错误:
Node <node reference> - Specify a valid .NET type name for this root node.
The current .NET type name of this root node is invalid (it is a reserved BizTalk Keyword or is an invalid C# identifier).
解决方案
右键单击错误中引用的 rood 节点,然后选择“ 属性”。
对于 RootNode TypeName 属性,请删除任何非法字符或保留字,例如点(.)。
适配器无法生成具有临时表的强类型存储过程的元数据
问题
适配器无法为其定义中包含临时表的强类型存储过程生成元数据。 适配器抛出以下异常。
Microsoft.ServiceModel.Channels.Common.MetadataException:
Retrieval of Operation Metadata has failed while building WSDL at 'TypedProcedure/<schema>/<stored_procedure_name>' --->
System.Data.SqlClient.SqlException: Invalid object name '<temp_table_name>'.
解决方案
SQL 适配器不支持为其定义中包含临时表的强类型存储过程生成元数据。 相反,您应该在使用“添加适配器服务引用插件”或“使用适配器服务附加程序”时,从过程节点下为相同的过程生成元数据。
在 Visual Studio 中使用适配器时绑定警告无效
问题
使用适配器在 Visual Studio 中创建应用程序并打开适配器生成的配置文件(app.config),会看到如下所示的警告:
The element 'bindings' has invalid child element 'sqlBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...
原因
出现此警告是因为 SQL 适配器绑定 sqlBinding
不是 Windows Communication Foundation (WCF)附带的标准绑定。
解决方案
可以放心地忽略此警告。
如果在同一应用程序中使用多个通知架构,或者在同一主机上的多个应用程序中使用通知架构,BizTalk Server 将引发异常
问题
BizTalk Server 会引发 XLANG 异常或提示应用程序无法定位文档规范,因为多个架构与消息类型匹配。
原因
发生此情况的原因有以下任一:
已在 BizTalk Server 项目中生成了多个通知架构,将其部署到 BizTalk Server 应用程序,然后运行应用程序以从 SQL Server 数据库接收通知。 由于通知架构很常见,因此在 BizTalk Server 应用程序中部署的架构之间存在冲突。
对于多个项目,你已为每个 BizTalk Server 项目生成通知架构,将每个项目部署到同一主机上的单独 BizTalk Server 应用程序,然后运行应用程序或应用程序来接收来自 SQL Server 数据库的通知。 由于可以在 BizTalk Server 中的应用程序中访问架构和程序集,因此在各种 BizTalk Server 应用程序和程序集下部署的常见架构之间存在冲突。
解决方案
对 BizTalk Server 应用程序使用单个通知架构文件。 如果需要在同一主机上的多个 BizTalk Server 应用程序中使用通知架构,请创建一个包含单个通知架构的应用程序,然后使用 BizTalk Server 中所有其他应用程序的通知架构。
适配器客户端在适配器客户端和 SQL Server 数据库之间还原连接后,在执行作时引发异常
问题
适配器客户端在对 SQL Server 数据库执行作时引发以下异常:
{System.Data.Common.DbException} = {"A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)"}
原因
在执行作期间,适配器使用来自 SQL ADO.NET 连接池的连接连接到 SQL Server 数据库,并执行该作。 如果适配器客户端和 SQL Server 数据库之间存在短暂的网络中断,或者 SQL Server 数据库暂时关闭,则 SQL ADO.NET 连接池中的所有连接都无效。 还原连接并尝试对 SQL Server 数据库执行作后,适配器将使用来自 SQL ADO.NET 连接池的相同无效连接,因此适配器客户端将引发异常。
解决方案
适配器客户端应在作执行中实现重试逻辑,其中应捕获异常,并将作重试计数指定为“n+1”,其中“n”是 MaxConnectionPoolSize 绑定属性指定的值。 这意味着,如果连接池中有“n”个连接数已无效,则从理论上讲,适配器客户端应重试最多“n+1”次以获取有效连接,从而执行该作。
例如,若要在 BizTalk Server 中指定重试计数,请在应用程序中打开发送端口的 “属性 ”对话框,单击对话框左窗格中的“ 传输高级选项 ”,然后在 “传输选项 ”区域中指定 重试计数 列表中的值。
在事务处理入站作中使用适配器时,内存使用率和线程计数增加
问题
在一个已处理的入站操作中(例如轮询),如果在被轮询的表中没有可用数据,并且适配器继续轮询,随着时间的推移,您会发现内存使用量和线程计数增加。
原因
如果表中没有可供轮询的数据,则每次接收超时周期后,Windows Communication Foundation(WCF)都会启动一个新线程以继续轮询操作。 因此,线程计数和内存使用量会在一段时间内增加。 但是,如果正在轮询的表具有一些数据,则同一线程将继续执行所有后续轮询。
解决方案
建议将 ReceiveTimeout 设置为最大可能值,即 24.20:31:23.6470000 (24 天),以便仅每隔 24 天生成一个新线程。 这将确保内存使用率和线程计数不会过快增长。
注释
如果已设置 SqlAdapterInboundTransactionBehavior,请确保 TransactionTimeout 也配置为最大可能值,即 24.20:31:23.6470000(24 天)。 使用此解决方法时,仅当必须配置事务隔离级别时,才能添加 SqlAdapterInboundTransactionBehavior。 否则,最好删除该行为。
有关 ReceiveTimeout 绑定属性的详细信息,请参阅 有关适用于 SQL Server 适配器绑定属性的 BizTalk 适配器的信息。 有关指定绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性。
注释
将适配器与 BizTalk Server 配合使用时,将超时设置为较大的值不会影响适配器的功能。