截屏解释问题:https://youtu.be/B-Q3T5KpiYk
将事务从客户端流向服务时Transaction.Current在等待服务调用之后变为null.
除非您在服务方法中创建一个新的TransactionScope,如下所示:
[OperationBehavior(TransactionScopeRequired = true)]
public async Task CallAsync()
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await _service.WriteAsync();
await _service.WriteAsync();
scope.Complete();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么默认情况下不启用TransactionScopeAsyncFlowOption我不知道,但我不想重复自己,所以我想我总是使用自定义行为创建一个带有该选项的内部事务管理器.
它甚至不必是服务调用服务,等待本地异步方法也使Transaction.Current无效.用一个例子来澄清
[OperationBehavior(TransactionScopeRequired = true)]
public async Task CallAsync()
{
await WriteAsync();
// Transaction.Current is now null
await WriteAsync();
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个Message Inspector,实现了IDispatchMessageInspector并将其作为服务行为附加,代码执行并且没有任何问题,但它与在service方法中声明transactionscope的效果不同.
public class TransactionScopeMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var transactionMessage = …Run Code Online (Sandbox Code Playgroud)