繁体   English   中英

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

[英]C# MVC Determine Successful Http Status Code

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

我的代码如下所示:

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-找到。 现在,根据文档,这将不会被分类为成功代码,但是,我看不到如何无法将其分类为成功代码。

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

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

提出1条建议将可以将if语句更改为:

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>

都没有运气

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

看一下: MVC错误处理涵盖哪些HTTP状态代码

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

<httpErrors>配置IIS,而<customErrors>配置ASP.NET来源: 如何使用httpErrors添加默认错误页面

示例: 如何在ASP.NET MVC中正确处理404?

另一篇好文章: 揭秘ASP.NET MVC 5错误页面和错误记录

本文详细介绍了如何正确设置404和500: ASP.NET MVC中的自定义错误页面。 容易吧?

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

做一个功能代替。

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传递给单个操作方法即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM