2012-01-17 5 views
1

Как часть моего предприятия в WCF, я просматриваю контракты с сообщениями и вижу, как они влияют на содержимое сообщения SOAP.Как перехватывать сообщения SOAP

Что было бы здорово, если бы вы могли перехватить сообщение и посмотреть, как он структурирован. Как бы я идти об этом, пожалуйста ...

(До сих пор я смотрел на Wireshark (слишком «низкого уровня») и думал о Microsoft SOAP Toolkit, но это был уволен по Microsoft еще в 2005 году)

ответ

4

Когда вы установили .NET 3.5 или выше, у вас должен быть WCF Test Client на вашем компьютере где-нибудь (скрытый глубоко внутри каталога, такого как C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ или что-то в этом роде).

Этот инструмент позволяет подключиться к службе WCF, и вы можете вызвать его методы - и вы можете посмотреть на запрос XML и ответ во всей своей красе :-)

enter image description here

The Другим вариантом было бы использовать что-то вроде бесплатной версии SoapUI, которая предназначена для тестирования служб SOAP и показать запрос и ответ в XML

enter image description here

SoapUI - отличный инструмент, но это не WCF специфический, это всего лишь «общий» инструмент SOAP/WSDL, который отлично работает с любой SOAP-службой.

Если вы не ищете «по требованию» захват запросов и ответов, но если вас больше интересует наличие следов всех запросов и ответов, вы должны исследовать WCF tracing features и настроить их по мере необходимости , Вы можете захватить весь трафик в файл *.svclog на диске, и есть WCF Service Trace Viewer (также бесплатный с WCF) для проверки этих файлов трассировки.

+0

Thanks; тестовый клиент WCF - это именно то, что я искал – SkeetJon

+1

Freakin awesome! Это очень полезный инструмент! благодаря –

2

Обычно я использую Fiddler для проверки мыльных сообщений, отправленных по http.

1

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

http://www.systemdeveloper.info/2013/11/trace-soap-requestresponse-xml-with.html

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Services.Protocols; 
using System.IO; 
using System.Xml; 

namespace PruebaServiciosNBC 
{ 
    class TraceExtension : SoapExtension 
    { 
     private Stream oldStream; 
     private Stream newStream; 

     private static XmlDocument xmlRequest; 
     /// <summary> 
     /// Gets the outgoing XML request sent to PayPal 
     /// </summary> 
     public static XmlDocument XmlRequest 
     { 
      get { return xmlRequest; } 
     } 

     private static XmlDocument xmlResponse; 
     /// <summary> 
     /// Gets the incoming XML response sent from PayPal 
     /// </summary> 
     public static XmlDocument XmlResponse 
     { 
      get { return xmlResponse; } 
     } 

     /// <summary> 
     /// Save the Stream representing the SOAP request 
     /// or SOAP response into a local memory buffer. 
     /// </summary> 
     /// <param name="stream"> 
     /// <returns></returns> 
     public override Stream ChainStream(Stream stream) 
     { 
      oldStream = stream; 
      newStream = new MemoryStream(); 
      return newStream; 
     } 

     /// <summary> 
     /// If the SoapMessageStage is such that the SoapRequest or 
     /// SoapResponse is still in the SOAP format to be sent or received, 
     /// save it to the xmlRequest or xmlResponse property. 
     /// </summary> 
     /// <param name="message"> 
     public override void ProcessMessage(SoapMessage message) 
     { 
      switch (message.Stage) 
      { 
       case SoapMessageStage.BeforeSerialize: 
        break; 
       case SoapMessageStage.AfterSerialize: 
        xmlRequest = GetSoapEnvelope(newStream); 
        CopyStream(newStream, oldStream); 
        break; 
       case SoapMessageStage.BeforeDeserialize: 
        CopyStream(oldStream, newStream); 
        xmlResponse = GetSoapEnvelope(newStream); 
        break; 
       case SoapMessageStage.AfterDeserialize: 
        break; 
      } 
     } 

     /// <summary> 
     /// Returns the XML representation of the Soap Envelope in the supplied stream. 
     /// Resets the position of stream to zero. 
     /// </summary> 
     /// <param name="stream"> 
     /// <returns></returns> 
     private XmlDocument GetSoapEnvelope(Stream stream) 
     { 
      XmlDocument xml = new XmlDocument(); 
      stream.Position = 0; 
      StreamReader reader = new StreamReader(stream); 
      xml.LoadXml(reader.ReadToEnd()); 
      stream.Position = 0; 
      return xml; 
     } 

     /// <summary> 
     /// Copies a stream. 
     /// </summary> 
     /// <param name="from"> 
     /// <param name="to"> 
     private void CopyStream(Stream from, Stream to) 
     { 
      TextReader reader = new StreamReader(from); 
      TextWriter writer = new StreamWriter(to); 
      writer.WriteLine(reader.ReadToEnd()); 
      writer.Flush(); 
     } 

     #region NoOp 
     /// <summary> 
     /// Included only because it must be implemented. 
     /// </summary> 
     /// <param name="methodInfo"> 
     /// <param name="attribute"> 
     /// <returns></returns> 
     public override object GetInitializer(LogicalMethodInfo methodInfo, 
      SoapExtensionAttribute attribute) 
     { 
      return null; 
     } 

     /// <summary> 
     /// Included only because it must be implemented. 
     /// </summary> 
     /// <param name="WebServiceType"> 
     /// <returns></returns> 
     public override object GetInitializer(Type WebServiceType) 
     { 
      return null; 
     } 

     /// <summary> 
     /// Included only because it must be implemented. 
     /// </summary> 
     /// <param name="initializer"> 
     public override void Initialize(object initializer) 
     { 
     } 
     #endregion NoOp 
    } 
}