2

JSONをクライアントに返すWCFサービスがあります。

これは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);

ここで、サービスがクライアントから受信するすべてのリクエストと、クライアントに返送される応答をログに記録したいと思います...この場合は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
}

しかし、これはどの応答もログに記録しないようです。response.Tostring()は「...stream」としか言いません。

上記は、サービスがSOAP XML形式でデータを返す場合に機能しますが、RESTサービスエンドポイントを呼び出すときにブラウザーにダウンロードされた*.jsファイル内のテキストであるJSON応答をログに記録したいと思います。例:http:// localhost:8080 / MyService / me / 2 /

これをどのように達成できるかについてのアイデアはありますか?

4

1 に答える 1

5

このコードは、RESTメッセージを操作するためのメカニズムを提供し、ボーナスとして、SOAPが通常どおりに通過できるようにします。少し煩わしいですが(ストリームは読み取りによって破壊されるため、コードで再生成する必要があります)、これ以上の方法は見つかりませんでした。

http://code.msdn.microsoft.com/WCF-REST-Message-Inspector-c4b6790b

于 2011-04-21T02:31:51.027 に答える