using EVCB_OCPP.DBAPI.Models.DBContext; using Microsoft.AspNetCore.Http.Extensions; using Newtonsoft.Json; using System.Net; namespace EVCB_OCPP.DBAPI.Middleware; public class APILogMiddleware { private readonly RequestDelegate _next; private readonly ILogger logger; //private readonly string apiLogConnectionString; public APILogMiddleware(RequestDelegate next, ILogger logger) { _next = next; this.logger = logger; } public async Task Invoke(HttpContext context) { try { var request = context.Request; CancellationToken cancellationToken = context?.RequestAborted ?? CancellationToken.None; logger.LogTrace("{Id}:{Method} {Path} {Body}",context.TraceIdentifier , context.Request.Method, context.Request.Path, context.GetPreLoadBody()); var originalBodyStream = context.Response.Body; var fakeResponseBody = new MemoryStream(); context.Response.Body = fakeResponseBody; var task = _next(context); await task; fakeResponseBody.Seek(0, SeekOrigin.Begin); await fakeResponseBody.CopyToAsync(originalBodyStream); string bodyData = string.Empty; if (fakeResponseBody != null) { fakeResponseBody.Seek(0, SeekOrigin.Begin); bodyData = new StreamReader(fakeResponseBody).ReadToEnd(); fakeResponseBody.Seek(0, SeekOrigin.Begin); } logger.LogTrace("{Id}:{StatusCode} {Body}", context.TraceIdentifier, context.Response.StatusCode, bodyData); } catch (Exception e) { logger.LogError(e.Message); logger.LogTrace(e.StackTrace); } } }