2017-09-22 42 views
0

メソッド、パス、ボディおよびその他の情報で着信リクエストをログに記録したいと思います。私の問題は、私が必要とするものをログに記録した後、メソッドのパラメータとしてnull変数だけを取得することです。私は、.NETコア1.1を使用しています、IIoggerFactory、Serilog拡張し、次のミドルウェア方法:asp.netコアmvc​​ログリクエストボディ

public async Task Invoke(HttpContext context) 
    { 
     StringValues sessionId; 
     var session = string.Empty; 
     if (context.Request.Headers.TryGetValue("X-SessionID", out sessionId)) 
     { 
      session = sessionId.FirstOrDefault(); 
      if (session != null) 
      { 
       var requestBodyStream = new MemoryStream(); 
       var originalRequestBody = context.Request.Body; 

       await context.Request.Body.CopyToAsync(requestBodyStream); 
       requestBodyStream.Seek(0, SeekOrigin.Begin); 

       var url = UriHelper.GetDisplayUrl(context.Request); 
       var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd(); 
       _logger.LogDebug($"{session} {context.Request.Method} {url} {requestBodyText}"); 

       requestBodyStream.Seek(0, SeekOrigin.Begin); 
       context.Request.Body = requestBodyStream; 

       await _next(context); 
       context.Request.Body = originalRequestBody; 
      } 
     } 
     await _next(context); 
    } 

どのように私が要求をログに記録し、ミドルウェア後のコントローラのリクエストボディを保つことができますか?

+1

この質問に見てみましょう:https://stackoverflow.com/questions/44498802/asp-net-core-modify-substitute-a-request-body – jmunoa7

+0

@ jmunoa7おかげで、私の問題を方法の終わりに私はもう一人を残していたということでした。 – Perrier

答えて

0

着信要求をログに記録するソリューションはうまくいきましたが、メソッドの最後に他のものを忘れました。ワーキングコード:

public async Task Invoke(HttpContext context) 
    { 
     StringValues sessionId; 
     var session = string.Empty; 
     if (context.Request.Headers.TryGetValue("X-SessionID", out sessionId)) 
     { 
      session = sessionId.FirstOrDefault(); 
      if (session != null) 
      { 
       var requestBodyStream = new MemoryStream(); 
       var originalRequestBody = context.Request.Body; 

       await context.Request.Body.CopyToAsync(requestBodyStream); 
       requestBodyStream.Seek(0, SeekOrigin.Begin); 

       var url = UriHelper.GetDisplayUrl(context.Request); 
       var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd(); 
       _logger.LogInformation($"{session} {context.Request.Method} {url} {requestBodyText}"); 

       requestBodyStream.Seek(0, SeekOrigin.Begin); 
       context.Request.Body = requestBodyStream; 

       await _next.Invoke(context); 
       context.Request.Body = originalRequestBody; 
      } 
     } else { 
      await _next.Invoke(context); 
     } 
    } 
関連する問題