2009-12-03 50 views
2

我正在使用WCF(.NET 3.5)與使用SOAP的服務器進行通信。在調試模式下運行時,我使用System.ServiceMode.Dispatcher.IClientMessageInspector和log4Net來記錄請求內容。從IClientMessageInspector登錄時屏蔽敏感信息

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()輸出匹配粗暴的方式來實現這一點,但我不知道是否有一個更優雅有效的方法,這將允許我在將消息轉換爲字符串之前修改密碼元素的值。

回答

2

沒有簡單的方法,除非你確保你永遠不會以這種方式發送證書(有許多方法發送令牌而不是實際的證書)。

如果您僅通過這些信息登錄到您的服務,則應該使用SSL。如果是這樣,您的MessageInspector可以檢查當前綁定是使用SSL還是傳輸安全性,如果是這種情況,則不記錄任何內容。另外,如果您想在開發中記錄消息,最好是利用WCF跟蹤基礎架構而不是自己進行低級別跟蹤(這樣您就不必在調試模式下添加檢查器)。有關內置WCF活動和消息跟蹤的更多信息,請參閱http://msdn.microsoft.com/en-us/library/ms732023.aspx