如何在c#中查看实际的SOAP请求/响应
本文关键字:SOAP 请求 响应 | 更新日期: 2023-09-27 18:15:29
我在我的项目中添加了一个wsdl文件作为服务引用。应用程序将SOAP消息发送到特定的设备,然后该设备以SOAP格式发送响应。
是否有一种方法可以查看包装在XML中的实际SOAP消息?必须打开wireshark来查看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消息使用相同的想法。