using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace MxAsbClient; internal sealed class AsbMessageDumpBehavior : IEndpointBehavior { private readonly Action trace; public AsbMessageDumpBehavior(Action trace) { this.trace = trace; } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.ClientMessageInspectors.Add(new Inspector(trace)); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } private sealed class Inspector : IClientMessageInspector { private readonly Action trace; public Inspector(Action trace) { this.trace = trace; } public object? BeforeSendRequest(ref Message request, IClientChannel channel) { MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue); Message copy = buffer.CreateMessage(); request = buffer.CreateMessage(); string action = copy.Headers.Action ?? string.Empty; if (action.Contains("registerItems", StringComparison.OrdinalIgnoreCase) || action.Contains("writeIn", StringComparison.OrdinalIgnoreCase) || action.Contains("readIn", StringComparison.OrdinalIgnoreCase) || action.Contains("publishWriteComplete", StringComparison.OrdinalIgnoreCase)) { trace("asb.request=" + copy); } return null; } public void AfterReceiveReply(ref Message reply, object? correlationState) { MessageBuffer buffer = reply.CreateBufferedCopy(int.MaxValue); Message copy = buffer.CreateMessage(); reply = buffer.CreateMessage(); string xml = copy.ToString(); if (xml.Contains("RegisterItemsResponse", StringComparison.OrdinalIgnoreCase) || xml.Contains("ReadResponse", StringComparison.OrdinalIgnoreCase) || xml.Contains("WriteBasicResponse", StringComparison.OrdinalIgnoreCase) || xml.Contains("PublishWriteCompleteResponse", StringComparison.OrdinalIgnoreCase)) { trace("asb.reply=" + xml); } } } }