我有一个简单的更新方法,如下所示:
public static void Execute()
{
var conn = new SqlConnection(ConnectionString);
conn.Open();
var cmd = new SqlCommand(UpdateQuery, conn);
cmd.ExecuteNonQuery();
}
当我从控制台应用程序调用此方法时,一切都按预期工作。由于我没有Complete
,因此会回滚TransactionScope更新。
using (new TransactionScope())
{
TestUpdate.Execute();
}
我创建了一个WCF服务,并在wcf操作中调用此方法,如下所示。一切都按预期工作。由于我没有Complete
,因此会回滚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();
我在控制台应用程序中启动一个事务,并在此事务中使用控制台应用程序调用该服务。当我调试时,我可以看到Transaction.Current
在IIS上不为空,我希望在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>