OperationContextScope与MessageInpectors

时间:2015-09-28 01:50:47

标签: wcf soapheader idispatchmessageinspector operationcontext iclientmessageinspector

帮助我理解这两者之间的差异。操作 无论您使用的.NET应用程序如WCF,控制台,Web等,都可以使用ContextScope,如果您正在调用任何其他服务(如WCF或基于Java的服务),则可以使用它[这在ASMX服务的情况下不起作用] ]将标题添加到外发邮件中。

如果是这样,为什么我们需要在任何客户端添加MessageInspectors来添加标头? OperationContextScope比MessageInspectors简单得多。任何人都明白这两个人的正确用法是什么?

1 个答案:

答案 0 :(得分:1)

客户端的

IClientMessageInspector和服务器端的IDispatchMessageInspector擅长检查消息体,可能在发送之前修改消息,或者修改收到的消息。

以下是一个示例:

public class MyMessageInspector : IClientMessageInspector
{
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    { 
        // Inspect and/or modify the message here
        MessageBuffer mb = reply.CreateBufferedCopy(int.MaxValue);
        Message newMsg = mb.CreateMessage();

        var reader = newMsg.GetReaderAtBodyContents().ReadSubtree();
        XElement bodyElm = XElement.Load(reader);
        // ...
        reply = newMsg;
    }
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        // Something could be done here
        return null;
    }
}

编写行为以轻松将检查器应用于客户端:

public class MyInspectorBehavior : IEndpointBehavior
{
    #region IEndpointBehavior Members
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(
            new MyMessageInspector()
            );
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {}
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {}
    public void Validate(ServiceEndpoint endpoint)
    {}
    #endregion
}

使用行为:

        ChannelFactory<IService1> cf = 
            new ChannelFactory<IService1>(
                new BasicHttpBinding(),
                "http://localhost:8734/DataService.svc");

        cf.Endpoint.Behaviors.Add(
            new MyInspectorBehavior()
            );

使用IDispatcherMessageInspector可以在服务器端完成同样的事情 可以使用C#,XML(app.config / web.config)或声明性地在服务实现上放置行为:

[MyServiceInspectorBehavior]
public class ServiceImpl : IService1
{ ...}

OperationContextScope对于处理标题(添加,删除)非常有用。

来自JuvalLöwy的WCF服务编程附录B很好地解释了OperationContextScope。 Juval的框架,ServiceModelEx帮助OperationContextScopes使用GenericContext<T>

请参阅Juval公司网站下载:http://www.idesign.net/Downloads

此致