Я создаю ASP.Net Core Web API с использованием .Net Core 2.1, и мне нужно создать собственное промежуточное программное обеспечение для глобальной обработки исключений. То, что я пытаюсь сделать, это захватить JSON-запрос, когда исключение произошло в моем приложении. А поскольку я использую пользовательское промежуточное ПО, я хочу, чтобы запрос JSON был доступен в моем промежуточном ПО. Как я могу это сделать?
Я попытался создать собственное промежуточное программное обеспечение для централизованной обработки исключений, следуя статье из Marinko Spasojevic и немного модифицировав ее для захвата запроса json. Кажется, запрос уже недоступен, так как исключение произошло внутри действия контроллеров (не в промежуточном программном обеспечении). Вот мой код:
Вот моя модель журнала ошибок
public class ErrorLog
{
public DateTime LogDate { get; set; }
public string URL { get; set; }
public string Request { get; set; }
public string Source { get; set; }
public string Message { get; set; }
}
Вот стандартная модель ответа, используемая в моем проекте
public class BaseResponse<T> : IBaseResponse where T : class
{
public bool Status { get; set; }
public string Message { get; set; }
public IEnumerable<T> Data { get; set; }
}
Вот мое промежуточное ПО для пользовательских исключений
public class GlobalException
{
private readonly RequestDelegate _next;
private readonly ICustomLogger _logger;
public GlobalException(RequestDelegate next, ICustomLogger logger)
{
_logger = logger;
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception ex)
{
ErrorLog log = new ErrorLog();
log = await HandleLogError(httpContext, ex);
_logger.LogError(log); // Custom build logger
await HandleExceptionAsync(httpContext, ex);
}
}
private static async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
BaseResponse<object> response = new BaseResponse<object>();
response.Status = false;
response.Message = "There is an exception occured.";
response.Data = new List<object>();
await context.Response.WriteAsync(response.Serialize());
}
private static async Task<ErrorLog> HandleLogError(HttpContext context, Exception exception)
{
Stream body = context.Request.Body;
context.Request.EnableRewind();
byte[] buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
string requestText = Encoding.UTF8.GetString(buffer);
context.Request.Body = body;
ErrorLog log = new ErrorLog();
UriBuilder builder = new UriBuilder();
builder.Scheme = context.Request.Scheme;
builder.Host = context.Request.Host.Host;
builder.Path = context.Request.Path.ToString();
builder.Query = context.Request.QueryString.ToString();
log.LogDate = DateTime.Now;
log.URL = builder.Uri.ToString();
log.Request = requestText;
log.Source = exception.Source;
log.Message = exception.Message;
return log;
}
}
И, наконец, зарегистрировать промежуточное ПО
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseMiddleware<GlobalException>();
...
}
Так, кто-нибудь может дать мне просветление? Любая помощь будет оценена и благодарна.