小编Ajd*_*eek的帖子

是否可以在自定义WCF服务行为中创建TransactionScope?(async,await,TransactionScopeAsyncFlowOption.Enabled)

TL; DR?

截屏解释问题: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)

c# wcf asynchronous transactionscope async-await

8
推荐指数
1
解决办法
693
查看次数

标签 统计

async-await ×1

asynchronous ×1

c# ×1

transactionscope ×1

wcf ×1