Dot-Net

將異常作為 JSON 消息返回

  • March 7, 2017

我正在使用 ASP.NET Core 開發一個 API,我正在努力處理異常。

當任何異常發生時,或者在我想返回具有不同狀態程式碼的自定義錯誤的任何控制器中,我想返回 JSON 格式的異常報告。我不需要錯誤響應中的 HTML。

我不確定我是否應該為此使用中間件或其他東西。我應該如何在 ASP.NET Core API 中返回 JSON 異常?

好的,我得到了一個可行的解決方案,我很滿意。

  1. 添加中間件:在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 
}
  1. 為消息創建一個類 編寫一個簡單的類來表示您希望在任何錯誤情況下作為請求發送的JSON 錯誤消息的實例:
public class ExceptionMessageContent
{

   public string Error { get; set; }
   public string Message { get; set; }

}
  1. 創建錯誤控制器添加處理所有預期和意外錯誤的**錯誤控制器。**請注意,這些路由對應於中間件配置。
[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));
   });
}

引用自:https://stackoverflow.com/questions/38664207