我有以下合同的WCF服務:WCF消息記錄 - 使用XPath添加過濾器查詢
[ServiceContract(Namespace="http://myNamespace.org/")]
public interface IMyService
{
[OperationContract]
string Invert(string s);
[OperationContract]
string ToUpper(string s);
}
客戶端調用兩種方法,Invert
和ToUpper
。想象一下,我想用消息記錄,但我感興趣的唯一方法是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
。然後,我的目標是記錄除了與Method1
和Method3
有關的消息之外的所有內容。我這樣做有以下過濾器:
<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>
這樣一來,不僅關係到Invert
,ToUpper
和Method2
的消息被記錄。
這可能是一個更清潔的方法來處理這與兩個獨立的過濾器,但目前我很滿意這一點。
如果我嘗試這個過濾器'/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/Invert')] '不會有'將一條消息放入日誌中:/ –
khlr
2011-05-28 17:40:33
您的第一個命名空間(soap)也不正確。您的文檔不是'http:// www.w3.org/2003/05/soap-envelope',而是'
'當我寫回答時,我沒有注意到這個另外的命名空間錯誤,對不起。 – jasso 2011-05-28 20:18:36哦,男孩,我很盲目...你說得對,如果我添加下面的過濾器,它按預期工作:)'/soap:Envelope/soap:Header/a:Action [starts-with(text(), 'http://myNamespace.org/IMyService/ToUpper')] '謝謝! –
khlr
2011-05-29 14:02:29