我有一个 BizTalk 解决方案,它会调用一个存储过程来查询和更新表。显然,每次我在负载平衡服务器中测试我的解决方案时都会遇到这个错误。
适配器无法传输要发送端口“SQLAdapter_Sendport”的消息,URL 为“mssql://server//StoredProc?”。将在为此发送端口指定的重试间隔后重新传输。
详细信息:System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败。
System.Runtime.InteropServices.COMException:由于通信问题,MSDTC 事务管理器无法将事务推送到目标事务管理器。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。
来自 HRESULT 的异常:
System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte [] 行踪的0x8004D02A) )
--- 内部异常堆栈跟踪结束 ---
我已经阅读了一些文章,我应该如下设置 DTC 属性。这些我已经在 BizTalk 和 SQL Server 中设置了。
此外,必须在 Windows 防火墙中添加 DTC。
最后,如果发送端口属性中的 useAmbientTransaction 设置为 True,我会一直遇到上述错误。
但是,如果我将 useAmbientTransaction 设置为 False,则消息在 SQL 中成功。
我在一些文章中读到微软不建议将 useAmbientTransaction 设置为 False,尤其是在存储过程中涉及更新和删除的情况下。但是我的解决方案在存储过程中使用了删除和更新,这就是为什么我需要将它的 useAmbientTransaction 设置为 True。但如果我这样做,我会不断遇到错误“MSDTC 事务管理器无法将事务推送到目的地......”
请为此提出任何可能的解决方案。