APILogMiddleware.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using EVCB_OCPP.DBAPI.Models.DBContext;
  2. using Microsoft.AspNetCore.Http.Extensions;
  3. using Newtonsoft.Json;
  4. using System.Net;
  5. namespace EVCB_OCPP.DBAPI.Middleware;
  6. public class APILogMiddleware
  7. {
  8. private readonly RequestDelegate _next;
  9. private readonly ILogger<APILogMiddleware> logger;
  10. //private readonly string apiLogConnectionString;
  11. public APILogMiddleware(RequestDelegate next,
  12. ILogger<APILogMiddleware> logger)
  13. {
  14. _next = next;
  15. this.logger = logger;
  16. }
  17. public async Task Invoke(HttpContext context)
  18. {
  19. try
  20. {
  21. var request = context.Request;
  22. CancellationToken cancellationToken = context?.RequestAborted ?? CancellationToken.None;
  23. logger.LogTrace("{Id}:{Method} {Path} {Body}",context.TraceIdentifier , context.Request.Method, context.Request.Path, context.GetPreLoadBody());
  24. var originalBodyStream = context.Response.Body;
  25. var fakeResponseBody = new MemoryStream();
  26. context.Response.Body = fakeResponseBody;
  27. var task = _next(context);
  28. await task;
  29. fakeResponseBody.Seek(0, SeekOrigin.Begin);
  30. await fakeResponseBody.CopyToAsync(originalBodyStream);
  31. string bodyData = string.Empty;
  32. if (fakeResponseBody != null)
  33. {
  34. fakeResponseBody.Seek(0, SeekOrigin.Begin);
  35. bodyData = new StreamReader(fakeResponseBody).ReadToEnd();
  36. fakeResponseBody.Seek(0, SeekOrigin.Begin);
  37. }
  38. logger.LogTrace("{Id}:{StatusCode} {Body}", context.TraceIdentifier, context.Response.StatusCode, bodyData);
  39. }
  40. catch (Exception e)
  41. {
  42. logger.LogError(e.Message);
  43. logger.LogTrace(e.StackTrace);
  44. }
  45. }
  46. }