Перехват текста сообщений

Версия 2.3 от Alexandr Fokin на 2020/08/13 11:12

Реализация перехвата всех отправленных и полученных сообщений
Также можно реализовать общую обертку над всеми клиентами, придоставляющую интерфейс перехвата

using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
 
  class MessageBehavior
        : IClientMessageInspector,
        IEndpointBehavior
    {
        public Action<string> OnSend { set; get; }
        public Action<string> OnReceive { set; get; }


        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(this);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }


        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            OnSend?.Invoke(request.ToString());
            return null;
        }

        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            OnReceive?.Invoke(reply.ToString());
        }
 
{
  using (Service1Client client = new Service1Client())
  {
    client.Endpoint.EndpointBehaviors.Add(
      new MessageBehavior()
      {
        OnReceive = OnMsg,
        OnSend = OnMsg
      });
 
    var res = client.GetData(123);
  }  
}

ссылки:
http://developereventlog.blogspot.com/2012/07/wcf-client-request-response-message.html

https://docs.microsoft.com/ru-ru/dotnet/api/system.servicemodel.dispatcher.iclientmessageinspector?view=dotnet-uwp-10.0
https://docs.microsoft.com/ru-ru/dotnet/api/system.servicemodel.dispatcher.clientruntime?view=netframework-4.8