我正在为我正在处理的某些服务创建一个 Web 测试客户端,作为其要求的一部分,我希望能够显示完整的请求和响应 SOAP 消息(以及向用户显示的 HTTP 标头)。
我实现了一个 MessageInspector 类实现IClient消息检查器,最值得注意的是BeforeSendRequest
and AfterReceiveReply
分别访问请求和响应消息的方法。
捕获响应(AfterReceiveReply)效果很好,但捕获请求只能部分起作用。我可以访问大部分消息,但是 SOAP 标头和 HTTP 标头都是空的。在 Fiddler 中查看请求,我可以看到 WCF 正在 SOAP 消息中发送 Security 标头和“一堆”HTTP 标头。
My BeforeSendRequest
方法很简单……要点是……
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
this.RequestMessage = request.ToString(); // Security header is missing from message
// Try to get HTTP headers
object req; // req is always null
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out req))
{
this.RequestHeaders = ((HttpRequestMessageProperty)req).Headers;
}
return null;
}
我不确定为什么 HTTP 和安全标头丢失。有一个更好的方法吗?
检查员在消息存在格式化程序之后、在消息到达任何协议通道(例如安全性)之前查看消息,这些协议通道(可能)会在传递消息之前更改消息(请参阅有关 WCF 通道的帖子中的图表)在https://learn.microsoft.com/en-us/archive/blogs/carlosfigueira/wcf-extensibility-channels)。因此,在检查器级别,您将无法找到消息添加的任何其他 SOAP 标头。 HTTP 标头由传输添加,传输在消息通过消息检查器后也会到达。
如果您想查看消息中的所有 SOAP 标头,您可以创建一个新的“协议”通道(示例位于http://msdn.microsoft.com/en-us/library/ms751495.aspx正是这样做的)或新的消息编码器(它可以包装现有的编码器,并在编码之前检查传出消息)。
要查看 HTTP 标头比较困难,因为传输是消息在 WCF 中传递的最后一部分。我认为你可以编写一个自定义传输通道来做到这一点,但这肯定会需要很多代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)