我在 .NET 4.5 中使用异步/等待模式来实现 WCF 中的一些服务方法。
服务示例:
合同:
[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
点而不手动将其传递到堆栈中?
不幸的是,这不起作用,我们将在未来的版本中看到修复方案。
同时,有一种方法可以将上下文重新应用到当前线程,这样您就不必传递对象:
public async Task<double> Add(double n1, double n2)
{
OperationContext ctx = OperationContext.Current;
await Task.Delay(100);
using (new OperationContextScope(ctx))
{
DoSomethingElse();
}
return n1 + n2;
}
在上面的例子中,做点别的事()方法将可以按预期访问OperationContext.Current。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)