2013-01-25 126 views
1

有沒有辦法將傳入的請求記錄到WCF服務?記錄WCF服務收到的請求

我有一個簡單的WCF服務託管爲Windows服務。 WCF服務每天寫入日誌。 有些時候會出現不良請求,我也想記錄。

有沒有辦法記錄進入的SOAP請求? 這樣可以幫助向客戶展示他們正在犯的錯誤。

問候。

回答

1

您可以嘗試執行IServiceBehaviorIParameterInspector類,該類將處理日誌記錄。

IServiceBehavior接口
ApplyDispatchBehavior是最重要的方法來實現:

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) 
     { 
      foreach (var endpoint in dispatcher.Endpoints) 
      { 
       foreach (var dispatchOperation in endpoint.DispatchRuntime.Operations) 
       { 
        dispatchOperation.ParameterInspectors.Add(new LoggingParameterInspector(/*reference to your logger*/)); 
       } 
      } 
     } 
    } 

你,無論是通過使您的服務實現類Attribute,或者通過應用此ServiceBehavior爲您服務在啓動時將其添加到定義中。

IParameterInspector
這個接口有兩個方法:BeforeCallAfterCall。在這些方法的實現中,您可以訪問操作名稱和給定方法的輸入。這使您可以創建對服務的所有呼叫的乾淨和簡單的跟蹤。

儘管我不確定如何準確記錄SOAP消息的內容,但此方法可爲您提供大量額外信息,特別是如果您實施定時記錄。

1

您可以在服務的配置文件中配置跟蹤和跟蹤級別。要查看日誌文件,Microsoft提供了一個特殊的跟蹤日誌查看器。通常情況下,您只需雙擊跟蹤文件即可在此查看器中打開它們。

這一問題已經在SO回答了很多次,例如How to turn on WCF tracing?

文檔在MSDN上 http://msdn.microsoft.com/en-us/library/ms733025.aspx

示例配置

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
     <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
     <source name="myUserTraceSource" 
       switchValue="Information, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="Error.svclog" /> 
    </sharedListeners> 
    </system.diagnostics> 
</configuration> 
0

我想添加到自@RoelF的迴應他在下面提到

儘管我不確定如何準確記錄SOAP 消息的內容,但此方法可爲您提供大量額外信息,特別是如果您實施定時記錄。

所以這裏是你用來從那些AfterCall BeforeCall方法獲得SOAP請求的線。

Message message = OperationContext.Current.RequestContext.RequestMessage; 

然後你可以記錄message.ToString()。這應該記錄您之後的SOAP請求。