Не удается прочитать объект httpcontext в блоке catch в .NET core
Я должен выполнить глобальную обработку ошибок для этого я создал пользовательскую среднюю посуду
но при обработке ошибок я должен регистрировать весь запрос также поэтому в блоке catch я регистрирую запрос также но в блоке catch параметр тела запроса всегда пуст где как и в блоке try я могу получить объект тела запроса
Что я уже пробовал:
public class HTTPStatuseCodeExceptionMiddleware { private readonly RequestDelegate _next; private readonly IErrorLogApplicationService _ErrorLogApplicationService; public HTTPStatuseCodeExceptionMiddleware(RequestDelegate next, IErrorLogApplicationService ErrorLogApplicationService) { _next = next ?? throw new ArgumentNullException(nameof(next)); _ErrorLogApplicationService = ErrorLogApplicationService; } public async Task Invoke(HttpContext context) { try { string IPAddress = GetIPAddress(); string Request = FormatRequest(context.Request).Result; await _next(context); } catch (HTTPStatusCodeException ex) { context.Response.Clear(); context.Response.StatusCode = ex.StatusCode; context.Response.ContentType = ex.ContentType; await context.Response.WriteAsync(ex.Message); // ErrorLog(context, ex); return; } catch(Exception ex) { string Request = FormatRequest(context.Request).Result; // ErrorLog(context, ex); } } //Format Request method private async Task<string> FormatRequest(HttpRequest request) { var body = request.Body; //This line allows us to set the reader for the request back at the beginning of its stream. request.EnableRewind(); //We now need to read the request stream. First, we create a new byte[] with the same length as the request stream... var buffer = new byte[Convert.ToInt32(request.ContentLength)]; //...Then we copy the entire request stream into the new buffer. await request.Body.ReadAsync(buffer, 0, buffer.Length); //We convert the byte[] into a string using UTF8 encoding... var bodyAsText = Encoding.UTF8.GetString(buffer); //..and finally, assign the read body back to the request body, which is allowed because of EnableRewind() request.Body = body; return $"{request.Scheme} {request.Host}{request.Path} {request.QueryString} {bodyAsText}"; }