Dot-Net
將異常作為 JSON 消息返回
我正在使用 ASP.NET Core 開發一個 API,我正在努力處理異常。
當任何異常發生時,或者在我想返回具有不同狀態程式碼的自定義錯誤的任何控制器中,我想返回 JSON 格式的異常報告。我不需要錯誤響應中的 HTML。
我不確定我是否應該為此使用中間件或其他東西。我應該如何在 ASP.NET Core API 中返回 JSON 異常?
好的,我得到了一個可行的解決方案,我很滿意。
- 添加中間件:在
Configure方法中,註冊中間件(ASP.NET Core 自帶)。public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // logging stuff, etc. app.UseStatusCodePagesWithReExecute("/error/{0}"); app.UseExceptionHandler("/error"); app.UseMvc(); // if you are using Mvc // probably other middleware stuff }
- 為消息創建一個類 編寫一個簡單的類來表示您希望在任何錯誤情況下作為請求發送的JSON 錯誤消息的實例:
public class ExceptionMessageContent { public string Error { get; set; } public string Message { get; set; } }
- 創建錯誤控制器添加處理所有預期和意外錯誤的**錯誤控制器。**請注意,這些路由對應於中間件配置。
[Route("[controller]")] public class ErrorController : Controller { [HttpGet] [Route("")] public IActionResult ServerError() { var feature = this.HttpContext.Features.Get<IExceptionHandlerFeature>(); var content = new ExceptionMessageContent() { Error = "Unexpected Server Error", Message = feature?.Error.Message }; return Content( JsonConvert.SerializeObject( content ), "application/json" ); } [HttpGet] [Route("{statusCode}")] public IActionResult StatusCodeError(int statusCode) { var feature = this.HttpContext.Features.Get<IExceptionHandlerFeature>(); var content = new ExceptionMessageContent() { Error = "Server Error", Message = $"The Server responded with status code {statusCode}" }; return Content( JsonConvert.SerializeObject( content ), "application/json" ); } }現在,當我想在任何地方拋出錯誤時,我可以這樣做。請求被重定向到錯誤處理程序並發送
500帶有格式良好的錯誤消息。此外,404其他程式碼也得到了優雅的處理。我想發送的任何自定義狀態程式碼,我也可以用 my 的實例返回它們ExceptionMessageContent,例如:// inside controller, returning IActionResult var content = new ExceptionMessageContent() { Error = "Bad Request", Message = "Details of why this request is bad." }; return BadRequest( content );
您正在尋找異常過濾器(作為屬性或全域過濾器)。從文件:
異常過濾器處理未處理的異常,包括在控制器創建和模型綁定期間發生的異常。僅當管道中發生異常時才呼叫它們。他們可以提供一個位置來在應用程序中實施常見的錯誤處理策略。
如果您希望將任何未處理的異常作為 JSON 返回,這是最簡單的方法:
public class JsonExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { var result = new ObjectResult(new { code = 500, message = "A server error occurred.", detailedMessage = context.Exception.Message }); result.StatusCode = 500; context.Result = result; } }您可以自定義響應以添加盡可能多的詳細資訊。ObjectResult 將被序列化為 JSON。
在 Startup 中添加過濾器作為 MVC 的全域過濾器:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.Filters.Add(typeof(JsonExceptionFilter)); }); }