2011-05-27 84 views
5

我有以下合同的WCF服務:WCF消息記錄 - 使用XPath添加過濾器查詢

[ServiceContract(Namespace="http://myNamespace.org/")] 
public interface IMyService 
{ 
    [OperationContract] 
    string Invert(string s); 

    [OperationContract] 
    string ToUpper(string s); 
} 

客戶端調用兩種方法,InvertToUpper。想象一下,我想用消息記錄,但我感興趣的唯一方法是ToUpper的另一種方法是頻繁使用,並記錄所有的消息將打擊日誌;)

Here,我讀了如何篩選郵件寫入日誌中。但是,我必須做一些錯誤的,因爲我的日誌仍然爲空...我的配置是這樣的

<system.serviceModel> 
    ... 
    <diagnostics> 
    <messageLogging logEntireMessage="true" logMessagesAtServiceLevel="false" logMalformedMessages="true" logMessagesAtTransportLevel="true"> 
     <filters> 
     <add xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/ToUpper')]</add> 
     </filters> 
    </messageLogging> 
    </diagnostics> 

</system.serviceModel> 

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
     <add name="ServiceModelTraceListener" /> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add initializeData="LogServer.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModelTraceListener" /> 
    </sharedListeners> 
    <trace autoflush="true" /> 
</system.diagnostics> 

如果我申請這個過濾器,也不會去一個消息到日誌... 那麼什麼我對上面的鏈接示例做錯了嗎?

沒有過濾器(帶有字符串參數hello調用的方法ToUpper)默認消息的XML痕跡看起來是這樣的:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
    <EventID>0</EventID> 
    <Type>3</Type> 
    <SubType Name="Information">0</SubType> 
    <Level>8</Level> 
    <TimeCreated SystemTime="2011-05-27T17:53:53.9908714Z" /> 
    <Source Name="System.ServiceModel.MessageLogging" /> 
    <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
    <Execution ProcessName="WcfLoggingTest.Host.vshost" ProcessID="4324" ThreadID="12" /> 
    <Channel /> 
    <Computer>MY-Machine</Computer> 
    </System> 
    <ApplicationData> 
    <TraceData> 
     <DataItem> 
     <MessageLogTraceRecord Time="2011-05-27T19:53:53.9908714+02:00" Source="TransportReceive" Type="System.ServiceModel.Channels.BufferedMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"> 
      <HttpRequest> 
      <Method>POST</Method> 
      <QueryString></QueryString> 
      <WebHeaders> 
       <VsDebuggerCausalityData>uIDPozEtlPQCjkhCodYdPWh6joUAAAAAamILDP7v3kG5sY6zKsB7HPPiLBWr+AVGmfFDQbk8GYAACQAA</VsDebuggerCausalityData> 
       <SOAPAction>"http://myNamespace.org/IMyService/ToUpper"</SOAPAction> 
       <Content-Length>157</Content-Length> 
       <Content-Type>text/xml; charset=utf-8</Content-Type> 
       <Accept-Encoding>gzip, deflate</Accept-Encoding> 
       <Expect>100-continue</Expect> 
       <Host>localhost:8731</Host> 
      </WebHeaders> 
      </HttpRequest> 
      <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
      <s:Header> 
       <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8731/Design_Time_Addresses/MyService/</To> 
       <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://myNamespace.org/IMyService/ToUpper</Action> 
      </s:Header> 
      <s:Body> 
       <ToUpper xmlns="http://myNamespace.org/"> 
       <s>hello</s> 
       </ToUpper> 
      </s:Body> 
      </s:Envelope> 
     </MessageLogTraceRecord> 
     </DataItem> 
    </TraceData> 
    </ApplicationData> 
</E2ETraceEvent> 

更新: 爲每一個機構誰是感興趣的解決方案,我終於它與日本學生支援機構的幫助下工作,感謝:

<add xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/ToUpper')]</add> 

然後我編輯我的界面和添加的方法Method1直到Method3。然後,我的目標是記錄除了與Method1Method3有關的消息之外的所有內容。我這樣做有以下過濾器:

<add xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/Method1')=false() and starts-with(text(),'http://myNamespace.org/IMyService/Method3')=false()]</add> 

這樣一來,不僅關係到InvertToUpperMethod2的消息被記錄。

這可能是一個更清潔的方法來處理這與兩個獨立的過濾器,但目前我很滿意這一點。

回答

7

您正在使用的Action元素的錯誤命名空間中的XPath表達式

你有

xmlns:a="http://www.w3.org/2005/08/addressing" 
... /a:Action[starts-with ... 

和文檔具有

<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"> 

所以名稱空間不同,因爲Action元素有附加到它的默認名稱空間定義。

而且你的XPath正在搜索soap:Envelope元素,因爲你的表達與/開始。我對框架不熟悉,可能會從示例XML(肥皂內容)中選擇一個子樹,然後應用XPath篩選器。如果情況並非如此,並且您的XPath應該在給定的XML文檔上生成匹配項,那麼您應該以//soap:Envelope元素(如/*/*/*/*/*/soap:Envelope)的路徑開始表達式。開始時使用運算符效率不高,因爲它需要遍歷整個文檔中的所有節點。

+0

如果我嘗試這個過濾器'/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/Invert')]'不會有'將一條消息放入日誌中:/ – khlr 2011-05-28 17:40:33

+0

您的第一個命名空間(soap)也不正確。您的文檔不是'http:// www.w3.org/2003/05/soap-envelope',而是' '當我寫回答時,我沒有注意到這個另外的命名空間錯誤,對不起。 – jasso 2011-05-28 20:18:36

+1

哦,男孩,我很盲目...你說得對,如果我添加下面的過濾器,它按預期工作:)'/soap:Envelope/soap:Header/a:Action [starts-with(text(), 'http://myNamespace.org/IMyService/ToUpper')]'謝謝! – khlr 2011-05-29 14:02:29

0

XPath查詢可能是問題所在。試試這個簡單的版本:

<filters> 
    <add xmlns:msgtr="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace" >//msgtr:SOAPAction[contains(.,'ToUpper')]</add> 
</filters> 
+0

此過濾器似乎沒有效果。如果我應用它,則不會過濾消息。它與我沒有使用過濾器的效果相同。 – khlr 2011-05-28 17:41:50

4

非常感謝您的有用信息!

根據我自己的學習,才能成功執行過濾,這些關鍵點必須強制執行,以及:

  1. 不雙啓動XPath表達式「/」,否則篩選將在工作中不所有。雖然這個雙重「/」對於XPath語法是正確的(與jasso在5月27日23:06,2011指出的一樣)。
  2. 不依賴於WCF配置編輯工具來選擇所涉及的xml名稱空間的別名。直到現在發現「s12」不起作用,但「s」或「s1a」可以(可能這是微軟所做的錯誤,我不確定)。