WCF - 获取原始请求/回复和操作名称

Posted

技术标签:

【中文标题】WCF - 获取原始请求/回复和操作名称【英文标题】:WCF - Get both raw request/reply and operation name 【发布时间】:2021-05-31 09:43:56 【问题描述】:

我正在尝试使用来自客户端的 IClientMessageInspector / IParameterInspector 实现 SOAP 请求/回复的日志记录。问题是我想在单个日志条目中记录消息的原始内容和操作名称。我知道我可以从IClientMessageInspector 访问原始消息,从IParameterInspector 访问操作名称。有没有办法将这两条信息结合起来?如何将数据从 IParameterInspector 传递到 IClientMessageInspector 或反之亦然?

请注意,IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel) 中的 message.Headers.Action 在某些情况下可能是空字符串。所以这不是一个选择。

如果可以在IParameterInspector 中实际获取原始消息,我已经有了操作名称。

有什么想法吗?

【问题讨论】:

【参考方案1】:

IClientMessageInspector 应用于整个服务而不是方法。无论调用 WCF 服务中的什么方法,IClientMessageInspector 都会捕获此消息。 IParameterInspector 应用于方法,IParameterInspector 只会在调用特定方法时捕获消息。

我的建议是分别实现IClientMessageInspector和IParameterInspector,然后分别写入日志。

这个link也有类似的问题,可以参考一下。

【讨论】:

感谢您的建议。我了解这两者之间的区别,但我需要找到一种方法来一次性记录这两种信息。最坏的情况是我必须自己从原始消息中解析操作名称。 我觉得没有什么好的方法可以同时记录两条信息。我们可以使用“System.Xml.Linq”提供的XDocument类来解析Soap消息。 当然,我可以使用任何 XML 实用程序来解析消息 XML。问题是我想避免深入研究整个 SOAP。 WCF 显然已经有一个解析器,它可以理解 SOAP 消息并且可以将消息映射到操作名称。这个解析器是公开的吗?我可以在IClientMessageInspector 中使用它吗?如果有,怎么做? 本博客中有一个例子可以参考:bartwullems.blogspot.com/2011/08/… 不幸的是,该博客文章描述了服务器端场景,而不是客户端 - OperationContext.Current 在客户端为空。我以前读过这篇博文。

以上是关于WCF - 获取原始请求/回复和操作名称的主要内容,如果未能解决你的问题,请参考以下文章

WCF 请求返回错误响应

跨 WCF Web 服务请求序列化通用 XML 数据

如何获取给定回复的原始推文

异步 WCF 服务超时

WCF REST 服务 400 错误请求

使用来自 ajax 请求的原始图像数据获取数据 URI