我在我的项目中添加了一个 wsdl 文件作为服务参考。应用程序将 SOAP 消息发送到特定设备,然后该设备以 SOAP 格式发送响应。
有没有办法查看包装在 XML 中的实际 SOAP 消息?必须打开wireshark 来查看SOAP 消息变得乏味。
我在我的项目中添加了一个 wsdl 文件作为服务参考。应用程序将 SOAP 消息发送到特定设备,然后该设备以 SOAP 格式发送响应。
有没有办法查看包装在 XML 中的实际 SOAP 消息?必须打开wireshark 来查看SOAP 消息变得乏味。
您可以使用 SVCTraceViewer 来跟踪每个服务调用来回发送的消息。您只需要设置配置,WCF 就会使用 .svclog 扩展名构建日志文件。
有关此工具及其相关配置的更多详细信息,请参见此处。这不需要运行任何 3rd 方工具或网络检查器等...这是 Microsoft 开箱即用的。
您可能正在寻找 SOAP 扩展,请看这篇文章:
在 WCF 的情况下,它有一种鲜为人知的拦截原始 XML自定义 MessageEncoder的方法。它在低级别上工作,因此它捕获真正的字节内容,包括任何格式错误的 xml。
如果您想使用这种方法,您需要使用自定义消息编码器将标准textMessageEncoding包装为新的绑定元素,并将该自定义绑定应用到您的config中的端点。
还有一个例子我是如何在我的项目中做到这一点的—— 包装textMessageEncoding、日志编码器、自定义绑定元素和配置。
我只是包装了 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 消息使用相同的想法。