你可能以前曾经问过这个问题,但请先听我说。
我有一个跨越不同服务器运行远程连接的项目。 在开发服务器上,所有测试都通过。
在具有相同配置的QA服务器中,大多数测试通过但是一对失败,例外是
底层提供程序在Open上失败。
内部异常:
分布式事务管理器(MSDTC)的网络访问已经完成 禁用。 请在安全配置中启用DTC以进行网络访问 MSDTC使用组件服务管理工具。
内心异常:
The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
据我所知,配置是正确的,实际上通过的测试运行完全相同的代码没有问题,因此没有与MSDTC相关的配置问题。
导致此问题的代码片段是一个实体框架连接,它将一个简单的行添加到数据库表中:
using (var inbound = new InBound.InBound())
{
var now = DateTime.Now;
var inMessage = inbound.InMessages.Create();
inMessage.Content = message.ToXmlFormattedString();
inMessage.Created = now;
inMessage.SerializedVersion = version;
inMessage.Updated = now;
inbound.InMessages.Add(inMessage);
inbound.SaveChanges(); //Exception here
}
这段代码在某些测试中起作用,但在其他一些测试中失败了。 此问题仅发生在QA环境中。所有与MSDTC相关的配置都已经过检查并且显示正确。 DEV环境具有相同的配置,并且不会发生此错误。
环境完全相同。 Microsoft Server 2012 R2,MS SQL Server 2008,相同的代码库,相同的设置。
消息中的xml在失败的测试和通过的测试中都是相同的。
我已经用尽了我可以寻找解决方案的地方列表,而且似乎没有合理的解释。
有什么想法吗?
如果我在连接字符串中添加“Enlist = false”,则测试再次通过。 但是我确实得到了一个被淹死的内部异常,那就是:
无法登记交易,因为本地交易在 连接的进展。完成本地事务并重试。
所以连接必须以某种方式打开,即使在调试期间数据库的状态是“关闭”。