मैं एक वेब सेवा का आह्वान करना चाहता हूं और मैं अनुरोध और प्रतिक्रिया वस्तुओं को साबुन-संदेश के रूप में प्राप्त करना चाहता हूं।

var response = client.invoke(parameter);

मैं किसी तरह संदेश भेजना और संदेश प्राप्त करना चाहता हूं।

0
Danil.T 26 अप्रैल 2019, 17:12

1 उत्तर

सबसे बढ़िया उत्तर

MSDN आलेख पर आधारित WCF एक्स्टेंसिबिलिटी - संदेश कार्लोस फिगुएरा के निरीक्षकों एक विकल्प एक MessageInspector का उपयोग कर रहा है।

एक वर्ग बनाएं जो एक लागू करता हो एंडबिहेवियर और 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());

मैंने इसे एक ऐड सेवा के साथ एक उदाहरण पर चलाया है और यह मेरा परिणाम था:

<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>
1
rene 27 अप्रैल 2019, 20:31