error hresult e_fail has been returned from a call to a com component

在 Asp.net 应用程序开发中,我们经常会同时遇到以下两个场景:

  1. 使用事务 TransactionScope
  2. Web 应用程序和 Sql Server 数据库部署到两台不同的服务器上

TransactionScope 需要使用到 MSDTC 服务,而在两台服务器上协调 MSDTC 服务确实是一件痛苦的事情,会遇到很多不同的问题。

以下是我遇到的问题之一,虽然最终解决了,但是解决方法不一定能够适用于所有的情况。

error hresult e_fail has been returned from a call to a com component

以下是分析和解决过程:

  1. 从网上能够查找到的90%的结果都是关于MSDTC设置的方法,如下:
     
  2. 在两台服务器上分别作了上面的设置,并且修改了防火墙等等,结果同样的问题还是出现
  3. 从老外的论坛上知道 DTCPing 这个工具,可以从微软网站上下载到:
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=5e325025-4dcd-4658-a549-1d549ac17644
    注:这个工具必须要两台服务器上同时运行才能看到效果。
  4. 输入对方服务器的 IP 地址,运行 DTCPing,提示只能通过 NetBIOS 名来解析。
  5. 改为输入对方服务器的机器名,运行 DTCPing,提示无法解析。
    两台服务器虽然不在同一个域里面,但是在同一个工作组里面,并且彼此之间通过 IP 地址可以 Ping 通,为什么无法解析对方的机器名?
  6. 对比了一下网络连接设置,发现“子网掩码”不一样,改成一样的,再次运行 DTCPing,结果成功了。。。

注意:把网络 DTC 访问设置为“不要求进行验证”被认为是不安全的,常规的做法应该是把两个服务器接入到同一个域中,并且把网络 DTC 访问设置为“要求对双方进行验证”。

posted on 2009-12-07 21:51  CsharpStyle  阅读(8498)  评论(0编辑  收藏  举报