C# 哪个WCF';s扩展点应用于设置每个操作的上下文?

C# 哪个WCF';s扩展点应用于设置每个操作的上下文?,c#,wcf,ambientcontext,C#,Wcf,Ambientcontext,我想为主机内运行的所有服务的每个操作设置环境上下文(类似于Thread.CurrentPrincipal的工作方式) 我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用WCF的经验。以下是解决方案: 首先,我们创建端点行为,向操作添加初始值设定项: public class CallContextInitializerBehavior : IEndpointBehavior { private readonly ICallContextInitializer callCo

我想为主机内运行的所有服务的每个操作设置环境上下文(类似于Thread.CurrentPrincipal的工作方式)

我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用WCF的经验。

以下是解决方案:

首先,我们创建端点行为,向操作添加初始值设定项:

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);