Перехват текста сообщений
Версия 1.2 от Alexandr Fokin на 2020/03/20 16:42
Реализация перехвата всех отправленных и полученных сообщений
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);
}
}
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);
}
}