传播的OperationContext成异步调用WCF [英] Propagate OperationContext into Async WCF Call
问题描述
使用C#5异步等待在WCF中,如果code的其余部分将继续在不同的线程中的await之后,我们失去当前操作语境。 (OperationContext.Current为空)。
With C#5 Async-Await in WCF, after an await if rest of the code continues on a different thread, we loose the Current Operation Context. (OperationContext.Current is null).
我工作的一个WCF服务,调用其他外部服务。并有在访问操作语境外部服务调用使用了一些自定义绑定扩展。所以,我需要背景下,这个通话过程中传播,它不能只是复制操作的上下文到一个局部变量工作。
I am working on a WCF Service which calls another external service. And there are a few Custom Binding Extensions used in the external service call which access the Operation Context. So I need the Context to be propagated during this call and it cant just work with copying the operation context into a local variable.
我的配置看起来像这样
<system.serviceModel>
<bindings>
<customBinding>
<binding name="MyCustomBinding">
<MyBindingExtention/>
<security authenticationMode="UserNameOverTransport" />
<textMessageEncoding maxReadPoolSize="64" >
<readerQuotas maxStringContentLength="8192" />
</textMessageEncoding>
<httpsTransport manualAddressing="false" maxReceivedMessageSize="65536" />
</binding>
</customBinding>
<client>
<endpoint address="https://ExternalService.svc" binding="customBinding" bindingConfiguration="MyCustomBinding" contract="Contract" name="ExternalService"/>
</client>
</bindings>
<extensions>
<bindingElementExtensions>
<add name="MyBindingExtention" type="Bindings.MyBindingExtention, Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
,其中 MyBindingExtention访问的的OperationContext 的得到一些信息。
where "MyBindingExtention" accesses the operationcontext to get some information.
public async Task<string> GetExternalData(int value)
{
var oc = OperationContext.Current;
//External Web service Call
var response = await externalService.GetDataAsync();
return response.text;
}
有使的OperationContext传播到外部服务呼叫,然后再放入余下的code执行的好方法吗?
Is there a good way to make the OperationContext propagate into the external Service Call and then again into the remaining code execution?
推荐答案
您可以使用自定义同步上下文。下面是一个示例的SynchronizationContext
实施
You can use a custom synchronization context. Here's a sample SynchronizationContext
implementation:
public class OperationContextSynchronizationContext : SynchronizationContext
{
private readonly OperationContext context;
public OperationContextSynchronizationContext(IClientChannel channel) : this(new OperationContext(channel)) { }
public OperationContextSynchronizationContext(OperationContext context)
{
OperationContext.Current = context;
this.context = context;
}
public override void Post(SendOrPostCallback d, object state)
{
OperationContext.Current = context;
d(state);
}
}
和用法:
var currentSynchronizationContext = SynchronizationContext.Current;
try
{
SynchronizationContext.SetSynchronizationContext(new OperationContextSynchronizationContext(client.InnerChannel));
var response = await client.RequestAsync();
// safe to use OperationContext.Current here
}
finally
{
SynchronizationContext.SetSynchronizationContext(currentSynchronizationContext);
}
这篇关于传播的OperationContext成异步调用WCF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!