我有以下情况:
客户端使用WCF
TransactionScope 启动事务并将其传播到 WCF 服务。
客户合同如下:
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(MyException))]
[TransactionFlow(TransactionFlowOption.Mandatory)]
bool DoSomeTransactionalWork();
[OperationContract]
[FaultContract(typeof(MyException))]
bool DoSomeWork();
}
使用的代理不会生成,它基于众所周知的包装器:
using (TransactionScope ts = new TransactionScope())
{
Service<IMyService>.Use(proxy =>
{
proxy.DoSomeTransactionalWork();
});
}
WCF Service 方法需要合约定义中的事务并对其进行隐式投票,它会抛出一个FaultException<MyException>
.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public bool DoSomeTransactionalWork()
{
throw new FaultException<MyException>(new MyException(myMessage));
}
WCF 代理收到一个TransactionAbortedException
设置InnerException
为 null 的结果,因此丢失了 WCF 故障。
try
{
using (TransactionScope ts = new TransactionScope())
{
Service<IMyService>.Use(proxy =>
{
proxy.DoSomeTransactionalWork();
});
}
}
catch (TransactionAbortedException tae)
{
// tae.InnerException is null
}
在类似的情况下,服务方法的合同不需要事务:
public bool DoSomeWork()
{
throw new FaultException<MyException>(new MyException(myMessage));
}
并且客户端只需通过相同的代理代码调用它,FaultException<MyException>
就会收到 a 。
try
{
Service<MyService>.Use(proxy =>
{
proxy.DoSomeWork();
});
}
catch (FaultException<MyException> tae)
{
//
}
我错过了什么还是预期的behavior
?
TIA。
编辑 1
客户端代码中的这种同步调用完全没有问题。
但是,如果您在使用 APM 时进行了不正确的异步调用,您可能会遇到我描述的行为。看我的回复。