gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:56:57 25 4
gpt4 key购买 nike

我在 .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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com