OperationContextScope против MessageInspectors

Помогите мне понять разницу между этими двумя. как по мне, операцию ContextScope можно использовать независимо от используемого вами приложения .NET, такого как WCF, Console, Web и т. д., везде, где это можно использовать, если вы вызываете любую другую службу, такую ​​​​как служба на основе WCF или Java [это не будет работать в случае службы ASMX] для добавления заголовков в исходящее сообщение.

Если да, то зачем нам нужны MessageInspectors на любой стороне клиента для добавления заголовков? OperationContextScope намного проще, чем MessageInspectors. кто-нибудь пролил свет, чтобы понять правильное использование этих двух?


person user3264937    schedule 28.09.2015    source источник


Ответы (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 полезен для обработки заголовков (добавление, удаление).

Programming WCF Services, Приложение B, от Juval Löwy, довольно хорошо объясняет OperationContextScope. Juval's Framework, ServiceModelEx помогает использовать OperationContextScopes с классом GenericContext<T>

См. сайт компании Juval для загрузки: http://www.idesign.net/Downloads

С уважением

person Emmanuel DURIN    schedule 28.09.2015
comment
Спасибо Эммануэль за ответ. Я знаю, что MessageInspectors предназначены исключительно для WCF, и как насчет OperationContextScope..можно ли это использовать, кроме WCF, такого как консольное приложение и т. д., например, мое консольное приложение вызывает веб-службу на основе Java, для которой нужен заголовок, присутствующий в нем, могу ли я использовать Operationcontextscope добавить в него заголовок при отправке запроса? - person user3264937; 29.09.2015