提问者:小点点

WCF合作伙伴事务管理器已禁用对远程/网络事务的支持。(HRESULT的例外:0x8004D025)


我有一个简单的更新方法,如下所示:

public static void Execute()
{
    var conn = new SqlConnection(ConnectionString);
    conn.Open();
    var cmd = new SqlCommand(UpdateQuery, conn);
    cmd.ExecuteNonQuery();
}

当我从控制台应用程序调用此方法时,一切都按预期工作。由于我没有完成TransactionScope更新被回滚。

using (new TransactionScope())
{
    TestUpdate.Execute();
}

我创建了一个WCF服务并在wcf操作中调用此方法,如下所示。同样,一切都按预期工作。由于我没有完成TransactionScope更新被回滚。

// Interface
[OperationContract, TransactionFlow(TransactionFlowOption.Allowed)]
void DoWork2();

// Implementation
public void DoWork2()
{
    using (new TransactionScope())
    {
        TestUpdate.Execute();
    }
}

// Console App
var client = new StaticServiceClient();
client.DoWork2();

我在控制台应用程序中启动一个事务,并在此事务中从控制台应用程序调用服务。当我调试时,我可以看到IIS上的Transaction.当前不为空,我希望在IIS中执行的代码将使用此事务。但是下面的异常是在conn.Open();中抛出的。

合作伙伴事务管理器已禁用对远程/网络事务的支持。(HRESULT的例外:0x8004D025)

// Interface
[OperationContract, TransactionFlow(TransactionFlowOption.Allowed)]
void DoWork();

// Implementation
[OperationBehavior(TransactionScopeRequired = true)]
public void DoWork()
{
    TestUpdate.Execute();
}

// Console App
using (new TransactionScope())
{
    var client = new StaticServiceClient();
    client.DoWork();
}

控制台应用程序在我的本地机器上执行,WCF服务托管在我的本地IIS上。数据库位于同一网络中的另一台服务器上。我相信,前两种情况证明MSDTC在我的本地机器和数据库服务器上都可以正常工作。那么,第三种情况可能有什么问题呢?

<bindings>
  <wsHttpBinding>
    <binding name="soapBinding" transactionFlow="true">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>
<services>
  <service name="ServiceLib.StaticService">
    <endpoint contract="ServiceLib.IStaticService" name="soap" binding="wsHttpBinding" bindingConfiguration="soapBinding" address="http://localhost:58759/StaticService.svc/Soap" />
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="soap" transactionFlow="true">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:58759/StaticService.svc/Soap"
    binding="wsHttpBinding" bindingConfiguration="soap" contract="ServiceReference.IStaticService"
    name="soap" />
</client>

共1个答案

匿名用户

确保WCF和DB服务器上的DTC安全设置如下: