异步WCF方法等待后,WebOperationContext为null

Jus*_*vey 4 c# wcf async-await

在以下示例中,该方法作为WCF服务操作公开,并且该服务在IIS中承载.在进入函数时,WebOperationContext.Current按预期设置.然而,在await完成等待之后,WebOperationContext.Current被设置为null.

        public async Task TestAsync()
    {
        //WebOperationContext.Current is set

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        //WebOperationContext.Current is null
    }
Run Code Online (Sandbox Code Playgroud)

这似乎是一个缺点,所以我想知道是否有人知道这一点以及是否有任何好的方法.我意识到我可以在局部变量中缓存对conext的引用,但这看起来不太好.

更新

一种有效的方法是

            public async Task TestAsync()
    {
        WebOperationContext ctx = WebOperationContext.Current;

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        //ctx is set        
    }
Run Code Online (Sandbox Code Playgroud)

而且,正如其他人所暗示的那样,我可以做到这一点

        public async Task TestAsync()
    {
        CallContext.LogicalSetData("WebOperationContext.Current", WebOperationContext.Current);

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        WebOperationContext ctx = (WebOperationContext)CallContext.LogicalGetData("WebOperationContext.Current");
    }
Run Code Online (Sandbox Code Playgroud)

每个的性能和线程安全性会产生什么影响?

Ste*_*ary 5

我听说WCF团队正在考虑解决方案OperationContext.Current,我希望他们也能解决这个问题WebOperationContext.Current.看到这篇SO帖子(注意Jon Cole是MS WCF团队的成员).

在此期间,您可以捕获变量中的值(提高可测试性,并且是我推荐的),将其添加到LogicalCallContext或安装您自己的SynchronizationContext(由于您使用自己的IIS托管,这将是棘手的SynchronizationContext).