2011-04-09 106 views
2

我有一個WCF服務,它將JSON返回給客戶端。如何記錄服務級別WCF中的JSON響應

這是在app.config

<system.serviceModel> 
<services> 
    <service name="MyServices.MyService"> 
    <endpoint address="" behaviorConfiguration="JsonBehavior" binding="webHttpBinding" 
     contract="Myervices.IMyervice"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyEmulator/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="True"/> 
     <serviceDebug includeExceptionDetailInFaults="True"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="JsonBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

這是由服務暴露現在

[OperationContract] 
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, Method = "GET", UriTemplate = "me/{id}")] 
    JsonObject GetObject(string id, string connection_type); 

樣品opertaion,我想的是,服務接收記錄每個請求來自客戶和回覆給客戶的迴應...在這種情況下,它是罪JSOn。

我創建一個自定義MessageInspector如下

public class MyMessageInspector : IDispatchMessageInspector 
{ 
    private bool LoggingEnabled; 
    #region IDispatchMessageInspector Members 

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
    { 
     Guid correlationState = Guid.NewGuid(); 
     if (this.LoggingEnabled) 
     { 
      StringBuilder message = new StringBuilder(); 
      message.AppendFormat("CorrelationState = {0}{1}", correlationState, Environment.NewLine); 
      message.AppendFormat("Local Address = {0}{1}", channel.LocalAddress, Environment.NewLine); 
      message.AppendFormat("Remote Address = {0}{1}", channel.RemoteAddress, Environment.NewLine); 
      message.AppendLine("Request"); 
      message.AppendLine(request.ToString()); 
      message.AppendLine(); 
      this.logger.LogMessage(message.ToString()); 
     } 

     return correlationState; 
    } 

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     if (this.LoggingEnabled) 
     { 
      StringBuilder message = new StringBuilder(); 
      message.AppendFormat("CorrelationState = {0}{1}", correlationState, Environment.NewLine); 
      message.AppendLine("Reply"); 
      message.AppendLine(reply.ToString()); 
      message.AppendLine(); 
      this.logger.LogMessage(message.ToString()); 
     } 
    } 

    #endregion 
} 

但這似乎沒有記錄任何的resposne ..的response.Tostring的()只說:「......流」

的如果我的服務以SOAP XML格式返回數據,上面的工作將會發生......但我希望它記錄JSON響應,這是我在調用REST服務端點時在瀏覽器中下載的* .js文件內部的文本。例如:http://localhost:8080/MyService/me/2/

有什麼想法我可以做到這一點?

+0

@ user330612:你試過配置WCF消息記錄? – 2011-04-09 20:02:18

+0

我該怎麼做?我想,我需要做的就是將MemoryStream格式的響應轉換爲類似於JSON的字符串 – user330612 2011-04-10 23:16:28

回答