2017-09-22 4 views
0

들어오는 요청을 메소드, 경로, 본문 및 기타 정보로 기록하고 싶습니다. 내 문제는 로깅 후 컨트롤러가 메소드 매개 변수로 null 변수 만 가져 오는 것입니다. 나는 그물 코어 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); 
     } 
    }