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