【问题标题】:Custom exceptions to Http status codes in ASP.NET APIASP.NET API 中 Http 状态代码的自定义异常
【发布时间】:2016-02-21 17:24:11
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net-web-api http-status-codes custom-exceptions


    【解决方案1】:

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

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

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

    对于跨控制器行为:您应该遵循以下步骤。

    1. 创建一个抽象的 BaseController
    2. 让您当前的 Controller 继承自 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);
        }
    }
    

    注意:
    您还可以将异常添加为已处理并将其重定向到其他一些控制器/动作

    filterContext.ExceptionHandled = true;
    filterContext.Result = this.RedirectToAction("Index", "Error");
    

    更多信息关于 ASP.NET MVC 错误处理可以找到HERE

    【讨论】:

    • 谢谢。这是有道理的。一个后续问题:我可以把它放在哪里,这样我就不必在每个 API 方法中重复这个逻辑?
    • @Sam,编辑了我的代码,下次请在最初的帖子中说明这些要求。
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 2021-12-02
    • 2019-08-08
    • 2021-12-29
    • 1970-01-01
    • 2023-03-21
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多