ASP.NET API中Http状态代码的自定义异常

Sam*_*Sam 4 c# http-status-codes custom-exceptions asp.net-web-api

我的业务层中有几个自定义异常,在我的ASP.NET应用程序中冒泡到我的API方法.

目前,它们都转换为Http状态500.如何映射这些自定义异常,以便我可以返回不同的Http状态代码?

Ore*_*aki 8

这可以使用Response.StatusCode setter和getter.

本地异常处理:对于本地操作异常处理,将以下内容放在调用代码中.

var responseCode = Response.StatusCode;
try
{
    // Exception was called
}
catch (BusinessLayerException1)
{
    responseCode = 201
}
catch (BusinessLayerException2)
{
    responseCode = 202
}
Response.StatusCode = responseCode;
Run Code Online (Sandbox Code Playgroud)

对于跨控制器行为:您应该遵循以下过程.

  1. 创建一个抽象的BaseController
  2. 使您当前的控制器继承自BaseController.
  3. 在BaseController中添加以下逻辑.

BaseController.cs

public abstract class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {
        var responseCode = Response.StatusCode;
        var exception = filterContext.Exception;
        switch (exception.GetType().ToString())
        {
            case "ArgumentNullException":
                responseCode = 601;
                break;

            case "InvalidCastException":
                responseCode = 602;
                break;
        }
        Response.StatusCode = responseCode;
        base.OnException(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:
您还可以将异常添加为已处理并将其重定向到其他Controller/Action中

filterContext.ExceptionHandled = true;
filterContext.Result = this.RedirectToAction("Index", "Error");
Run Code Online (Sandbox Code Playgroud)

有关ASP.NET MVC错误处理的更多信息可以在这里找到