C# 哪个WCF';s扩展点应用于设置每个操作的上下文?
我想为主机内运行的所有服务的每个操作设置环境上下文(类似于Thread.CurrentPrincipal的工作方式) 我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用WCF的经验。以下是解决方案: 首先,我们创建端点行为,向操作添加初始值设定项:C# 哪个WCF';s扩展点应用于设置每个操作的上下文?,c#,wcf,ambientcontext,C#,Wcf,Ambientcontext,我想为主机内运行的所有服务的每个操作设置环境上下文(类似于Thread.CurrentPrincipal的工作方式) 我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用WCF的经验。以下是解决方案: 首先,我们创建端点行为,向操作添加初始值设定项: public class CallContextInitializerBehavior : IEndpointBehavior { private readonly ICallContextInitializer callCo
public class CallContextInitializerBehavior : IEndpointBehavior
{
private readonly ICallContextInitializer callContextInitializer;
private ServiceHost serviceHost;
public CallContextInitializerBehavior(ICallContextInitializer callContextInitializer)
{
this.callContextInitializer = callContextInitializer;
}
public void AddToHost(ServiceHost host)
{
// only add to host once
if (this.serviceHost != null)
{
return;
}
this.serviceHost = host;
foreach (ServiceEndpoint endpoint in this.serviceHost.Description.Endpoints)
{
endpoint.Behaviors.Add(this);
}
}
public void Validate(ServiceEndpoint endpoint)
{
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
foreach (DispatchOperation operation in endpointDispatcher.DispatchRuntime.Operations)
{
operation.CallContextInitializers.Add(callContextInitializer);
}
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
}
然后我们创建自己的ICallContextInitializer实现:
public class MyCallContextInitializer : ICallContextInitializer
{
public object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message messa
{
...do domething here...
return myCorrelationState; // or null if not important;
}
public void AfterInvoke(object correlationState)
{
UserInfo userInfoBeforeInvoke = (UserInfo) correlationState;
AmbientContext.Context.SetCurrent(userInfoBeforeInvoke);
}
}
最后通过调用应用行为(当然,最好使用IoC):
如果您想要的“上下文”不是WCF特定的且对所有服务都是全局的,那么简单的静态类不是这样吗?@jeroenmoster它需要在每个请求上进行一些初始化,以便使用异步操作进行正确的流。在这种情况下,您的上下文是每次调用的,您可能需要一个。我没有使用这个的经验,但是也许有人可以把这些信息伪造成一个正确的答案。几个链接@Jeroemoster请回答我的问题,我会接受的。一切正常。谢谢
var initializer = new MyCallContextInitializer();
var behavior = new CallContextInitializerBehavior(initilizer);
behvior.AddToHost(serviceHost);