.net - 在 WCF 服务中使用 async/await 时,OperationContext.Current 在第一次等待后为空

标签 .net wcf .net-4.5 async-await

我在 .NET 4.5 中使用 async/await 模式在 WCF 中实现一些服务方法。
示例服务:

契约(Contract):

[ServiceContract(Namespace = "http://async.test/")]
public interface IAsyncTest
{
    Task DoSomethingAsync();
}

执行:
MyAsyncService : IAsyncTest
{
    public async Task DoSomethingAsync()
    {
        var context = OperationContext.Current; // context is present

        await Task.Delay(10);

        context = OperationContext.Current; // context is null
    }
}

我遇到的问题是在第一次之后 await OperationContext.Current返回 null我无法访问 OperationContext.Current.IncomingMessageHeaders .

在这个简单的例子中,这不是问题,因为我可以在 await 之前捕获上下文。 .但在现实世界中的案例OperationContext.Current正在从调用堆栈的深处访问,我真的不想为了进一步传递上下文而更改大量代码。

有没有办法在 await 之后获取操作上下文点而不手动将其传递到堆栈中?

最佳答案

我认为您最好的选择是实际捕获它并手动传递它。您可能会发现这提高了代码的可测试性。

也就是说,还有其他几种选择:

  • 将其添加到 LogicalCallContext .
  • 安装自己的 SynchronizationContext这将设置 OperationContext.Current当它执行 Post ;这就是 ASP.NET 如何保留其 HttpContext.Current .
  • 自己安装 TaskScheduler其中集 OperationContext.Current .

  • 您可能还想在 Microsoft Connect 上提出此问题。

    关于.net - 在 WCF 服务中使用 async/await 时,OperationContext.Current 在第一次等待后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797091/

    相关文章:

    c# - 为资源管理器创建嵌入资源

    c# - 使用 Process、RegistryKey 将 .NET Framework 代码移植到 .NET Standard

    wcf - SSL 服务器证书存在 WCF 的一个名称?

    c# - 允许双击标题栏以最大化对话框但没有最大最小按钮

    c# - 在对话框的构造函数中调用 .Show() 或 .ShowDialog 是一种好习惯

    c# - 在 WCF 中公开可序列化枚举属性

    c# - 流式wcf结束后如何删除文件

    c# - 在 metroapp 中显示存储在存储文件中的图片

    c# - 粗鲁的标签不断出现在前面

    c# - Uri 忽略特殊字符