public static void UseExceptionHandlerMiddleware(this IApplicationBuilder builder) { builder.Run(async context => { var errorFeature = context.Features.Get <IExceptionHandlerFeature>(); var exception = errorFeature.Error; if (exception is DomainException) { var domainException = exception as DomainException; context.Response.StatusCode = StatusCodes.Status400BadRequest; context.Response.ContentType = "application/json"; var error = new DomainExceptionContract() { Key = domainException.Key, Message = domainException.Message }; await context.Response.WriteAsync(error.ToString()); } else if (exception is ForbiddenException) { context.Response.StatusCode = StatusCodes.Status403Forbidden; context.Response.ContentType = "application/json"; var error = new DomainExceptionContract() { Key = "Forbidden", Message = "Forbidden" }; await context.Response.WriteAsync(error.ToString()); } else { var loggerFactory = builder.ApplicationServices.GetService(typeof(ILoggerFactory)) as ILoggerFactory; var exceptionLogger = loggerFactory.CreateLogger(typeof(ExceptionHandlerMiddlewareExceptions)); exceptionLogger.LogError(exception, "Exception"); context.Response.StatusCode = StatusCodes.Status500InternalServerError; } }); }
public async Task Invoke(HttpContext context) { try { await _next(context); } catch (DomainException domainException) { var error = new DomainExceptionContract() { Key = domainException.Key, Message = domainException.Message }; _logger.LogError(domainException, domainException.Message); await WriteErrorMessageToResponse(context, HttpStatusCode.BadRequest, error); } catch (ForbiddenException) { var error = new DomainExceptionContract() { Key = "Forbidden", Message = "Forbidden" }; await WriteErrorMessageToResponse(context, HttpStatusCode.Forbidden, error); } catch (Exception ex) { var error = new DomainExceptionContract() { Key = "InternalServerError", Message = ex.Message }; _logger.LogError(ex, ex.Message, new object[] { }); await WriteErrorMessageToResponse(context, HttpStatusCode.InternalServerError, error); } }
private async Task WriteErrorMessageToResponse(HttpContext context, HttpStatusCode httpStatusCode, DomainExceptionContract error) { context.Response.Headers[HeaderNames.CacheControl] = "no-cache"; context.Response.Headers[HeaderNames.Pragma] = "no-cache"; context.Response.Headers[HeaderNames.Expires] = "-1"; context.Response.Headers.Remove(HeaderNames.ETag); var result = JsonConvert.SerializeObject(error); context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)httpStatusCode; await context.Response.WriteAsync(result); }