public override void OnException(ExceptionContext context) { var errorModel = new ErrorResponseModel { Message = "An error has occured." }; var exception = context.Exception; if(exception == null) { // Should never happen. return; } var badRequestException = exception as BadRequestException; if(badRequestException != null) { context.HttpContext.Response.StatusCode = 400; if(badRequestException.ModelState != null) { errorModel = new ErrorResponseModel(badRequestException.ModelState); } else { errorModel.Message = badRequestException.Message; } } else if(exception is ApplicationException) { context.HttpContext.Response.StatusCode = 402; } else if(exception is NotFoundException) { errorModel.Message = "Resource not found."; context.HttpContext.Response.StatusCode = 404; } else if(exception is SecurityTokenValidationException) { errorModel.Message = "Invalid token."; context.HttpContext.Response.StatusCode = 403; } else { var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ExceptionHandlerFilterAttribute>>(); logger.LogError(0, exception, exception.Message); errorModel.Message = "An unhandled server error has occured."; context.HttpContext.Response.StatusCode = 500; } var env = context.HttpContext.RequestServices.GetRequiredService<IHostingEnvironment>(); if(env.IsDevelopment()) { errorModel.ExceptionMessage = exception.Message; errorModel.ExceptionStackTrace = exception.StackTrace; errorModel.InnerExceptionMessage = exception?.InnerException?.Message; } context.Result = new ObjectResult(errorModel); }
public override Task ReturnQuotaExceededResponse(HttpContext httpContext, RateLimitRule rule, string retryAfter) { var message = string.IsNullOrWhiteSpace(_options.QuotaExceededMessage) ? $"Slow down! Too many requests. Try again in {rule.Period}." : _options.QuotaExceededMessage; httpContext.Response.Headers["Retry-After"] = retryAfter; httpContext.Response.StatusCode = _options.HttpStatusCode; httpContext.Response.ContentType = "application/json"; var errorModel = new ErrorResponseModel { Message = message }; return httpContext.Response.WriteAsync(JsonConvert.SerializeObject(errorModel)); }