2017-10-22 3 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을 사용하는 것이 좋지만이 방법을 사용할 수 있습니다. 당신은 요청 본문의 버퍼링을 가능하게하는 EnableRequestBodyTracking=true으로 요청 바디를 기록 할 수 있습니다 및 LimitToServiceRequests=false를 구성하는 것은 아닌 서비스 요청, 예컨대 기록합니다 내가 원하는 정확히 무엇을

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

합니다. –