2017-10-22 7 views
1

私のServiceStackAppHostが処理しようとするすべてのHTTPリクエストを記録します。私はまともな解決策を考え出したが、MemoryStreamHttpListenerRequestに注入すると、これがどこかで爆発するかどうかはわからない。InputStreamが私を取り戻すことができないからだ。 APPHOSTAppHost要求の一般ロギングServiceStack内のボディ

protected override Task ProcessRequestAsync(HttpListenerContext context) 
    { 
     var request = context?.Request; 
     if (request != null) 
     { 
      Log.R(request); 
     } 

     return base.ProcessRequestAsync(context); 
    } 

インサイド

マイログイン

public static void R(HttpListenerRequest request) 
    { 
     var guid = Guid.NewGuid().ToString().Replace("-", ""); 
     L(LogType.Request, "{1} Url: {0} LocalEndPoint: {2} RemoteEndPoint: {3}", request.Url, request.HttpMethod, request.LocalEndPoint.ToString(), request.RemoteEndPoint.ToString()); 
     foreach (var header in request.Headers.AllKeys) 
     { 
      Trace.WriteLine(string.Format("{0} H {1}: {2}", (char)LogType.Request, header, request.Headers[header])); 
     } 
     string content = null; 
     if (request.InputStream != null) 
     { 
      MemoryStream memStream = new MemoryStream(); 
      request.InputStream.CopyTo(memStream); 
      request.InputStream.Close(); 
      request.InputStream.Dispose(); 
      memStream.Position = 0; 
      var reader = new StreamReader(memStream); 
      { 
       content = reader.ReadToEnd(); 
       memStream.Position = 0; 
       request.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        .Where(field => field.Name == "m_RequestStream") 
        .First() 
        .SetValue(request, memStream); 
      } 
     } 

     if (!string.IsNullOrEmpty(content)) 
     { 
      foreach (var line in content.Split('\n')) 
      { 
       Trace.WriteLine(string.Format("{0} B {1}", (char)LogType.Request, line)); 
      }     
     } 
    } 

としては、これが現在取り組んでいるが、私はそれを解放するのが怖い、と述べました。だから、あなたは身体ですべてのリクエストを記録するより良い方法を持っているかもしれません。

答えて

2

built-in Request Loggerを使用することをおすすめしますが、この方法を使用することもできます。

Plugins.Add(new RequestLogsFeature { 
    EnableRequestBodyTracking = true, 
    LimitToServiceRequests = false, 
}); 
+0

私が望んでいたまさに:あなたはリクエストボディのバッファリングを可能にするとLimitToServiceRequests=falseを設定することも例えば、非サービス要求を記録しますどのEnableRequestBodyTracking=trueの要求本体を記録することができます。 –

関連する問題