error hresult e_fail has been returned from a call to a com component
在 Asp.net 应用程序开发中,我们经常会同时遇到以下两个场景:
- 使用事务 TransactionScope
- Web 应用程序和 Sql Server 数据库部署到两台不同的服务器上
TransactionScope 需要使用到 MSDTC 服务,而在两台服务器上协调 MSDTC 服务确实是一件痛苦的事情,会遇到很多不同的问题。
以下是我遇到的问题之一,虽然最终解决了,但是解决方法不一定能够适用于所有的情况。
error hresult e_fail has been returned from a call to a com component
以下是分析和解决过程:
- 从网上能够查找到的90%的结果都是关于MSDTC设置的方法,如下:
- 在两台服务器上分别作了上面的设置,并且修改了防火墙等等,结果同样的问题还是出现
- 从老外的论坛上知道 DTCPing 这个工具,可以从微软网站上下载到:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=5e325025-4dcd-4658-a549-1d549ac17644
注:这个工具必须要两台服务器上同时运行才能看到效果。 - 输入对方服务器的 IP 地址,运行 DTCPing,提示只能通过 NetBIOS 名来解析。
- 改为输入对方服务器的机器名,运行 DTCPing,提示无法解析。
两台服务器虽然不在同一个域里面,但是在同一个工作组里面,并且彼此之间通过 IP 地址可以 Ping 通,为什么无法解析对方的机器名? - 对比了一下网络连接设置,发现“子网掩码”不一样,改成一样的,再次运行 DTCPing,结果成功了。。。
注意:把网络 DTC 访问设置为“不要求进行验证”被认为是不安全的,常规的做法应该是把两个服务器接入到同一个域中,并且把网络 DTC 访问设置为“要求对双方进行验证”。
posted on 2009-12-07 21:51 CsharpStyle 阅读(8498) 评论(0) 编辑 收藏 举报