using Microsoft.AspNetCore.Http; using Serilog; using Serilog.Context; using System; using System.IO; using System.Threading.Tasks; namespace IRaCIS.Core.API._PipelineExtensions.Serilog { public class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; public RequestResponseLoggingMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { var ContentType = context.Request.ContentType; var isUploadRelation = false; if (ContentType != null) { isUploadRelation = context.Request.ContentType.Contains("multipart/form-data") || context.Request.ContentType.Contains("boundary"); } if (isUploadRelation) { using (LogContext.PushProperty("RequestBody", string.Empty)) { await _next.Invoke(context); } } else { var requestBodyPayload = await ReadRequestBody(context.Request); using (LogContext.PushProperty("RequestBody", requestBodyPayload)) { await _next.Invoke(context); } } //var request = context.Request; // Read and log request body data //SerilogHelper.RequestPayload = requestBodyPayload; #region ResponseBody //// Read and log response body data //// Copy a pointer to the original response body stream //var originalResponseBodyStream = context.Response.Body; //// Create a new memory stream... //using (var responseBody = new MemoryStream()) //{ // // ...and use that for the temporary response body // context.Response.Body = responseBody; // // Continue down the Middleware pipeline, eventually returning to this class //await _next(context); // // Copy the contents of the new memory stream (which contains the response) to the original stream, which is then returned to the client. // await responseBody.CopyToAsync(originalResponseBodyStream); //} //string responseBodyPayload = await ReadResponseBody(context.Response); //_diagnosticContext.Set("ResponseBody", responseBodyPayload); #endregion } private async Task ReadRequestBody(HttpRequest request) { // Ensure the request's body can be read multiple times (for the next middlewares in the pipeline). request.EnableBuffering(); using var streamReader = new StreamReader(request.Body, leaveOpen: true); var requestBody = await streamReader.ReadToEndAsync(); // Reset the request's body stream position for next middleware in the pipeline. request.Body.Position = 0; return requestBody == null ? String.Empty : requestBody.Trim(); } private static async Task ReadResponseBody(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); string responseBody = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return $"{responseBody}"; } } }