2011-11-08 96 views
16

enter image description here如何記錄WCF消息內容?

我認爲這很簡單,但我看不出如何告訴WCF記錄郵件正文。我有:

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Verbose"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EntLibLoggingProxyTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging" 
      name="traceListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
<system.serviceModel> 
    <diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" /> 
    </diagnostics> 
    ...etc.., 
    ...etc... 
</system.Model> 
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General"> 
    <listeners> 
    <add fileName="_trace-xml.log" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.XmlTraceListenerData,Microsoft.Practices.EnterpriseLibrary.Logging" 
       traceOutputOptions="None" 
       type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.XmlTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging" 
     name="XML Trace Listener" />  
    ...etc... other listeners 
    </listeners> 
    ...etc... 
</loggingConfiguration> 

但我所記錄的是關於消息,而不是消息正文的東西。我需要更改日誌消息內容?

回答

0

如果你需要消息體,你必須以編程方式自己捕捉它們。使用服務行爲在IDispatchMessageInspector或IClientMessageInspector實現中安裝消息檢查器並捕獲消息。

+0

唉。所以做這樣的博客http://wcfpro.wordpress.com/2011/03/29/iclientmessageinspector/給我*一切*我需要或有更多的,我需要知道在配置或代碼來記錄消息體? –

+0

該鏈接幾乎是你需要的一切。它唯一沒有顯示的是如何安裝端點行爲,這非常簡單(endpoint.Behaviors.Add)。 – JohnC

+4

這個答案是錯誤的。爲'System.ServiceModel.MessageLogging'配置一個源,並且一個監聽器記錄這些消息對我來說工作正常。沒有必要的信息檢查員。 –

25

就跟隨這說明完美的作品對我來說:http://msdn.microsoft.com/en-us/library/ms730064.aspx

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel.MessageLogging"> 
    <listeners> 
      <add name="messages" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="c:\logs\messages.svclog" /> 
     </listeners> 
    </source> 
</sources> 
</system.diagnostics> 

<system.serviceModel> 
<diagnostics> 
<messageLogging 
    logEntireMessage="true" 
    logMalformedMessages="false" 
    logMessagesAtServiceLevel="true" 
    logMessagesAtTransportLevel="false" 
    maxMessagesToLog="3000" 
    maxSizeOfMessageToLog="2000"/> 
</diagnostics> 
</system.serviceModel> 

無需編寫任何代碼,這個...

+4

如果我這樣做,我會得到關於WCF正在做什麼的大量信息,但是沒有任何有關消息的內容: –

+0

這很奇怪。你可以發佈你的svcviewer.exe加載了messages.svclog並顯示消息標籤內容的屏幕截圖嗎? – kroonwijk

+0

<的ApplicationData> ... 被讀取的消息 ... 系統.ServiceModel.Channels.BufferedMessage/48266778 ...

3

我發現了一個版本的問題。當WCF服務項目針對.Net 3.5構建時,我在查看器工具中看到了完整的消息主體。針對.Net 4.0構建,我沒有看到消息正文。

+1

啊啊,真讓人氣憤!這似乎是它!其中一個「當出現問題時你只需要它」。 –

+1

給在.NET 4.0上遇到麻煩的人。注意, 跟蹤是: '<源名稱= 「System.ServiceModel」>' 消息是: '<源名稱= 「System.ServiceModel.MessageLogging」>' HTTP://計算器.COM /問題/ 11264260/WCF-如何-DO-I-跟蹤消息體 –