如何在c#中查看实际的SOAP请求/响应

本文关键字:SOAP 请求 响应 | 更新日期: 2023-09-27 18:15:29

我在我的项目中添加了一个wsdl文件作为服务引用。应用程序将SOAP消息发送到特定的设备,然后该设备以SOAP格式发送响应。

是否有一种方法可以查看包装在XML中的实际SOAP消息?必须打开wireshark来查看SOAP消息是很乏味的。

如何在c#中查看实际的SOAP请求/响应

您可以使用SVCTraceViewer来跟踪每个服务调用来回发送的消息。您只需要设置配置和WCF构建日志文件与.svclog扩展名。

关于此工具及其相关配置的更多详细信息在这里。这不需要任何第三方工具或网络检查运行等…

您可能正在寻找SOAP扩展,看看这篇文章:

在发送到。net中的WebService之前获取SOAP消息

使用Fiddler检查消息。参考:Using fiddler.

在WCF的情况下,它有一个鲜为人知的方式来拦截原始XML - 自定义MessageEncoder。它在底层工作,所以它捕获真实的字节内容,包括任何格式错误的xml。

如果你想使用这种方法,你需要包装一个标准的textMessageEncoding和自定义的消息编码器作为新的绑定元素,并在你的配置中应用自定义的绑定到端点。

也有一个例子,我是如何做到的在我的项目-包装textMessageEncoding,日志编码器,自定义绑定元素和配置

我只是包装了SOAP xml writer方法,然后在方法内部创建了一个事件,当写入刷新时:

protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
{
   VerboseXmlWriter xmlWriter = new VerboseXmlWriter(base.GetWriterForMessage(message, bufferSize));
   xmlWriter.Finished += XmlWriter_Finished;
}

VerboseXmlWriter的类是这样的(只是一个想法):

public sealed class VerboseXmlWriter : XmlWriter
    {
        private readonly XmlWriter _wrappedXmlWriter;
        private readonly XmlTextWriter _buffer;
        private readonly System.IO.StringWriter _stringWriter;
        public event EventHandler Finished;
        private void OnFinished(StringPayloadEventArgs e)
        {
            EventHandler handler = Finished;
            handler?.Invoke(this, e);
        }
        public VerboseXmlWriter(XmlWriter implementation)
        {
            _wrappedXmlWriter = implementation;
            _stringWriter = new System.IO.StringWriter();
            _buffer = new XmlTextWriter(_stringWriter);
            _buffer.Formatting = Formatting.Indented;
        }
        ~VerboseXmlWriter()
        {
            OnFinished(new StringPayloadEventArgs(_stringWriter.ToString()));
        }
        public override void Flush()
        {
            _wrappedXmlWriter.Flush();
            _buffer.Flush();
            _stringWriter.Flush();
        }
        public string Xml
        {
            get
            {
                return _stringWriter?.ToString();
            }
        }
        public override WriteState WriteState => _wrappedXmlWriter.WriteState;
        public override void Close()
        {
            _wrappedXmlWriter.Close();
            _buffer.Close();
        }
        public override string LookupPrefix(string ns)
        {
            return _wrappedXmlWriter.LookupPrefix(ns);
        }
        public override void WriteBase64(byte[] buffer, int index, int count)
        {
            _wrappedXmlWriter.WriteBase64(buffer, index, count);
            _buffer.WriteBase64(buffer, index, count);
        }
        public override void WriteSurrogateCharEntity(char lowChar, char highChar)
        {
            _wrappedXmlWriter.WriteSurrogateCharEntity(lowChar, highChar);
            _buffer.WriteSurrogateCharEntity(lowChar, highChar);
        }
and so on...

使用与示例覆盖相同的结构实现接口XmlWriter。我还创建了一个event-args类来传输SOAP消息。

public class StringPayloadEventArgs : EventArgs
    {
        public string Payload { get; }
        public StringPayloadEventArgs(string payload)
        {
            Payload = payload;
        }
    }

您也可以对传入的SOAP消息使用相同的想法。