Существует ли простой способ получения сообщения мыла для запроса и сообщения мыла для ответа при вызове веб-службы? - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу вызвать веб-сервис и хочу получить объекты запроса и ответа в виде мыльных сообщений.

var response = client.invoke(parameter);

Я хочу каким-то образом получить отправленное и полученное сообщение.

1 Ответ

1 голос
/ 27 апреля 2019

На основе статьи MSDN Расширяемость WCF - Инспекторы сообщений от Карлоса Фигейры. Один из вариантов - использование MessageInspector.

Создание класса, реализующего EndBehavior и ClientMessageInspector .Буферизуйте запрос и ответное сообщение, чтобы вы могли использовать их позже.В этом примере я печатаю их в консоли.

Вот комбинированная реализация:

// using System.ServiceModel.Description;
// using System.ServiceModel.Dispatcher;
// using System.ServiceModel.Channels;
// using System.ServiceModel
public class InspectBehaviorAndnspector : IEndpointBehavior, IClientMessageInspector
{

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

    public MessageBuffer RequestBuffer;
    public MessageBuffer ReplyBuffer;

    public void AfterReceiveReply(ref Message reply, object correlationState){
       // messages are read only
       ReplyBuffer = reply.CreateBufferedCopy(2048);
       // so recreate the message after it was buffered
       reply = ReplyBuffer.CreateMessage();
    }

    public object BeforeSendRequest(ref Message request, IClientChannel channel){
       // messages are read only
       RequestBuffer = request.CreateBufferedCopy(2048);
       // so recreate the message after it was buffered
       request = RequestBuffer.CreateMessage();
       return "42";
    }

    // not needed for client
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }

    public void Validate(ServiceEndpoint sep) 
    {
    }
    public void AddBindingParameters(ServiceEndpoint sep, BindingParameterCollection bpc)
    {
    }
}

Теперь на вашем экземпляре client, предполагая, что он происходит от ClientBase, вы можете сделать:

var inspector = new InspectBehaviorAndnspector();
client.Endpoint.Behaviors.Add(inspector);

// this is your call
var response = client.invoke(parameter);

// either do a ToString
Console.WriteLine(inspector.RequestBuffer.CreateMessage().ToString());
// or Write it with XmlWriter
var sb = new StringBuilder();
using(var xw = XmlWriter.Create(sb, new XmlWriterSettings {Indent =true})) {
    inspector.ReplyBuffer.CreateMessage().WriteMessage(xw);
}
Console.WriteLine(sb.ToString());

Я запустил это на примере со службой Add, и это был мой результат:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/ISelfHostTest/Add</Action>
  </s:Header>
  <s:Body>
    <Add xmlns="http://tempuri.org/">
      <x>3</x>
      <y>2</y>
    </Add>
  </s:Body>
</s:Envelope>

<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <AddResponse xmlns="http://tempuri.org/">
      <AddResult>5</AddResult>
    </AddResponse>
  </s:Body>
</s:Envelope>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...