Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Microsoft.AspNetCore.Http;
- using System;
- using System.IO;
- using System.Text;
- using System.Threading.Tasks;
- namespace Middleware
- {
- /// <summary>
- /// Middleware used for logging HTTP requests and responses, their content and statuses
- /// </summary>
- public class LoggingMiddleware
- {
- private RequestDelegate _next;
- private readonly ILogger _logger;
- public LoggingMiddleware(ILogger logger, RequestDelegate next)
- {
- _logger = logger;
- _next = next;
- }
- public async Task InvokeAsync(HttpContext context)
- {
- StringBuilder log = new StringBuilder();
- // Request
- log.Append($"A {context.Request.Method} request arrived at {context.Request.Path} {context.Request.QueryString.ToString()}");
- log.Append($"\nRequest time (local): {DateTime.Now.ToString("r")}");
- if (context.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase))
- {
- context.Request.EnableBuffering();
- using (var reader = new StreamReader(context.Request.Body, System.Text.Encoding.UTF8, true, 10240, true))
- {
- string body = await reader.ReadToEndAsync();
- string bodyLog = !string.IsNullOrEmpty(body) ? body : "EMPTY";
- log.Append($"\nBody: {bodyLog}");
- context.Request.Body.Seek(0, SeekOrigin.Begin);
- }
- }
- // Response
- var originalBodyStream = context.Response.Body;
- using (var responseBody = new MemoryStream())
- {
- context.Response.Body = responseBody;
- // Invoke next middleware
- await _next(context);
- var response = context.Response;
- response.Body.Seek(0, SeekOrigin.Begin);
- string responseText = await new StreamReader(response.Body).ReadToEndAsync();
- string bodyLog = !string.IsNullOrEmpty(responseText) ? responseText : "EMPTY";
- response.Body.Seek(0, SeekOrigin.Begin);
- log.Append($"\nResponse time (local): {DateTime.Now.ToString("r")}");
- log.Append($"\nResponse status: {context.Response.StatusCode}");
- log.Append($"\nBody: {bodyLog}");
- await responseBody.CopyToAsync(originalBodyStream);
- }
- await Task.Run(() =>
- {
- _logger.Log(log.ToString());
- return Task.CompletedTask;
- });
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement