8

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

有没有办法查看包装在 XML 中的实际 SOAP 消息?必须打开wireshark 来查看SOAP 消息变得乏味。

4

5 回答 5

4

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

有关此工具及其相关配置的更多详细信息,请参见此处。这不需要运行任何 3rd 方工具或网络检查器等...这是 Microsoft 开箱即用的。

于 2013-05-26T09:46:07.097 回答
3

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

在将 SOAP 消息发送到 .NET 中的 WebService 之前获取它

于 2013-05-26T09:47:07.470 回答
2

使用Fiddler检查消息。参考:使用提琴手

于 2013-05-26T09:44:48.573 回答
2

在 WCF 的情况下,它有一种鲜为人知的拦截原始 XML自定义 MessageEncoder的方法。它在低级别上工作,因此它捕获真正的字节内容,包括任何格式错误的 xml。

如果您想使用这种方法,您需要使用自定义消息编码器将标准textMessageEncoding包装为新的绑定元素,并将该自定义绑定应用到您的config中的端点。

还有一个例子我是如何在我的项目中做到这一点的—— 包装textMessageEncoding、日志编码器、自定义绑定元素配置

于 2018-10-03T06:24:52.853 回答
0

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

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使用与示例覆盖相同的结构实现接口。我还创建了一个事件参数类来传输 SOAP 消息。

public class StringPayloadEventArgs : EventArgs
    {
        public string Payload { get; }

        public StringPayloadEventArgs(string payload)
        {
            Payload = payload;
        }
    }

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

于 2021-08-18T18:23:08.373 回答