Как перехватить SOAP-сообщения - PullRequest
1 голос
/ 17 января 2012

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

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

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

Ответы [ 3 ]

4 голосов
/ 17 января 2012

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

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

enter image description here

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

enter image description here

SoapUI - отличный инструмент, но он не специфичен для WCF, это просто "универсальный" инструмент SOAP / WSDL, который отлично работает против любых сервисов SOAP.

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

2 голосов
/ 17 января 2012

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

1 голос
/ 13 декабря 2013

Если вы хотите написать запись в журнале, попробуйте использовать класс 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...