Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.63 KB | None | 0 0
  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Middleware
  8. {
  9.     /// <summary>
  10.     /// Middleware used for logging HTTP requests and responses, their content and statuses
  11.     /// </summary>
  12.     public class LoggingMiddleware
  13.     {
  14.         private RequestDelegate _next;
  15.         private readonly ILogger _logger;
  16.  
  17.         public LoggingMiddleware(ILogger logger, RequestDelegate next)
  18.         {
  19.             _logger = logger;
  20.             _next = next;
  21.         }
  22.  
  23.         public async Task InvokeAsync(HttpContext context)
  24.         {
  25.             StringBuilder log = new StringBuilder();
  26.  
  27.             // Request
  28.             log.Append($"A {context.Request.Method} request arrived at {context.Request.Path} {context.Request.QueryString.ToString()}");
  29.             log.Append($"\nRequest time (local): {DateTime.Now.ToString("r")}");
  30.  
  31.             if (context.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase))
  32.             {
  33.                 context.Request.EnableBuffering();
  34.  
  35.                 using (var reader = new StreamReader(context.Request.Body, System.Text.Encoding.UTF8, true, 10240, true))
  36.                 {
  37.                     string body = await reader.ReadToEndAsync();
  38.                     string bodyLog = !string.IsNullOrEmpty(body) ? body : "EMPTY";
  39.  
  40.                     log.Append($"\nBody: {bodyLog}");
  41.                     context.Request.Body.Seek(0, SeekOrigin.Begin);
  42.                 }
  43.             }
  44.  
  45.             // Response
  46.             var originalBodyStream = context.Response.Body;
  47.             using (var responseBody = new MemoryStream())
  48.             {
  49.                 context.Response.Body = responseBody;
  50.  
  51.                 // Invoke next middleware
  52.                 await _next(context);
  53.  
  54.                 var response = context.Response;
  55.  
  56.                 response.Body.Seek(0, SeekOrigin.Begin);
  57.                 string responseText = await new StreamReader(response.Body).ReadToEndAsync();
  58.                 string bodyLog = !string.IsNullOrEmpty(responseText) ? responseText : "EMPTY";
  59.                 response.Body.Seek(0, SeekOrigin.Begin);
  60.  
  61.                 log.Append($"\nResponse time (local): {DateTime.Now.ToString("r")}");
  62.                 log.Append($"\nResponse status: {context.Response.StatusCode}");
  63.                 log.Append($"\nBody: {bodyLog}");
  64.  
  65.                 await responseBody.CopyToAsync(originalBodyStream);
  66.             }
  67.  
  68.             await Task.Run(() =>
  69.             {
  70.                 _logger.Log(log.ToString());
  71.                 return Task.CompletedTask;
  72.             });
  73.         }
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement