C#MVC确定成功的Http状态代码

时间:2016-03-23 13:36:13

标签: c# asp.net-mvc http-status-codes http-status-code-302

我有一些代码可以根据收到的错误为我显示特定视图执行错误处理。

我的代码如下所示:

protected void Application_EndRequest()
    {
        var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode);
        if (!response.IsSuccessStatusCode)
        {
            var rd = new RouteData();
            IController c = new ErrorController();
            switch (response.StatusCode)
            {
                case HttpStatusCode.BadRequest:
                    Response.Clear();
                    rd.Values["controller"] = "Error";
                    rd.Values["action"] = "BadRequest";
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                    break;
                case HttpStatusCode.NotFound:
                    Response.Clear();
                    rd.Values["controller"] = "Error";
                    rd.Values["action"] = "NotFound";
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                    break;
                case HttpStatusCode.InternalServerError:
                    Response.Clear();
                    rd.Values["controller"] = "Error";
                    rd.Values["action"] = "InternalServerError";
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                    break;
                case HttpStatusCode.Forbidden:
                    Response.Clear();
                    rd.Values["controller"] = "Error";
                    rd.Values["action"] = "Forbidden";
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                    break;
                default:
                    Response.Clear();
                    rd.Values["controller"] = "Error";
                    rd.Values["action"] = "GenericError";
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                    break;
            }
        }

这适用于标准的http状态代码,如文档中所定义,200-299的响应代码无法处理和传递。

然而,我的问题是,这是最好的方法吗?

这是由于我的一个请求返回状态代码302 - Found。现在,根据文档,这不会被归类为成功的代码,但是,我不知道它是如何被归类为成功的。

因此有更好的方法来解释所有成功的代码而不仅仅是200-299吗?

非常感谢您的任何意见和建议。我知道可能没有绝对的答案。

将1条建议更改为:

if(!(statuscode >= 400 && statuscode <= 599)

这是因为4xx代码被定义为客户端错误,5xx代码被定义为服务器错误。因此它应该全部抓住它们?

但是如何处理可怕的418? :)

修改

我尝试过使用httpErrors:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <clear/>
    <error path="/Error/NotFound" responseMode="ExecuteURL" statusCode="400"/>
</httpErrors>

以及web.config中的customErrors:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="403" redirect="~/Error/Forbidden" /> 
    <error statusCode="500" redirect="~/Error/InternalServerError" />        
</customErrors>

两者都没有运气

2 个答案:

答案 0 :(得分:1)

您不一定需要涵盖所有错误代码(从400到500)。

查看:Which HTTP Status Codes to cover for MVC error handling

最好使用已经在管道中的处理程序,而不是在Application_EndRequest()中使用的处理程序。我的意思是你应该使用web.config中的<httpErrors ...和/或<customErrors

<httpErrors>配置IIS,而<customErrors>配置ASP.NET 资料来源:How to add a default error page using httpErrors

示例:How can I properly handle 404 in ASP.NET MVC?

另一篇好文章:Demystifying ASP.NET MVC 5 Error Pages and Error Logging

本文详细说明了如何正确设置404和500:Custom error pages in ASP.NET MVC. Easy, right?

答案 1 :(得分:1)

我不确定错误代码,但您不应该像这样复制和粘贴代码。

改为执行功能。

protected void Application_EndRequest()
{
    var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode);

    if (!response.IsSuccessStatusCode)
    {
        switch (response.StatusCode)
        {
            case HttpStatusCode.BadRequest:
                ErrorAction("BadRequest");
                break;
            case HttpStatusCode.NotFound:
                ErrorAction("NotFound");
                break;
            case HttpStatusCode.InternalServerError:
                ErrorAction("InternalServerError");
                break;
            case HttpStatusCode.Forbidden:
                ErrorAction("Forbidden");
                break;
            default:
                ErrorAction("GenericError");
                break;
        }
    }
}

// Sends a request to the ErrorController
private void ErrorAction(string action)
{
    var rd = new RouteData();
    IController c = new ErrorController();

    Response.Clear();

    rd.Values["controller"] = "Error";
    rd.Values["action"] = action;

    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}

该代码表明您可以完全消除不同的ErrorController操作,并将查询字符串中的StatusCode传递给单个操作方法。