我正在使用 WCF (.NET 3.5) 与使用 SOAP 的服务器通信。在 Debug模式下运行时,我使用 System.ServiceMode.Dispatcher.IClientMessageInspector
和 log4Net 记录请求内容。
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
log.Debug(request);
}
我的困难是有时 SOAP 消息包含我必须在写入日志之前屏蔽的身份验证信息
例如在下面的示例中,我想将密码元素记录为 <password>**********</password>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://service.soap.host.com/credentials</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<credentials xmlns="http://service..soap.host.com/credentials">
<username>MyUsername</username>
<password>MyPassword</password>
</credentials>
</s:Body>
</s:Envelope>
我可以通过在 request.ToString()
的输出上使用正则表达式匹配以一种粗略的方式实现这一点但我想知道是否有更优雅、更高效的方法允许我在将消息转换为字符串之前修改 password 元素的值。
最佳答案
对此没有简单的方法,除非您确保永远不会以这种方式发送凭据(有很多方法可以发送 token 而不是实际凭据)。
如果您传递这些信息只是为了登录您的服务,那么无论如何您都应该使用 SSL。如果是这种情况,您的 MessageInspector 可以检查当前绑定(bind)是否使用 SSL 或传输安全性,如果是这种情况,则不会记录任何内容。
顺便说一句,如果你想在开发中记录消息,你最好利用 WCF 跟踪基础结构而不是自己进行低级跟踪(这样你就不必在 Debug模式下添加检查器) .参见 http://msdn.microsoft.com/en-us/library/ms732023.aspx有关内置 WCF 事件和消息跟踪的更多信息。
关于c# - 从 IClientMessageInspector 登录时屏蔽敏感信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1839498/