【问题标题】:C# MVC Determine Successful Http Status CodeC# MVC 确定成功的 Http 状态码
【发布时间】:2016-03-23 13:36:12
【问题描述】:

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

我的代码如下所示:

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>

都没有运气

【问题讨论】:

  • 你知道你可以这样做in web.config
  • 您使用的是 IIS7+ 吗?如果是,请尝试仅使用 httpErrors。
  • 我已经分别尝试过了。我相信我必须使用早期版本的 iis

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


【解决方案1】:

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

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

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

&lt;httpErrors&gt; 配置 IIS,而&lt;customErrors&gt; 配置 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?

【讨论】:

  • 请您进一步解释一下。我之前尝试过使用 CustomErrors 却无法正常工作,因此我采用了这种方法
  • 我已经编辑了我的答案,你可能想谷歌一下,这是一个常见问题。
【解决方案2】:

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

改为创建一个函数。

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

【讨论】:

  • 我同意代码没有完善,需要清理以避免重复的代码,这纯粹是因为我还没有机会这样做并且想得到想法。我会重构你的建议,因为我喜欢这种方法。但是,您认为这是完成这项工作的合适解决方案还是有更好/更精细的方法?
  • 正如@Chris 在另一个答案中所说,您不需要编写此代码。 MVC 处理 web.config 中的错误。见stackoverflow.com/questions/717628/…
  • 附言。尽量避免编写需要清理的代码。 :-)
  • 我同意代码不需要清理,但是,我正处于努力让它工作的地步,这是首要任务。我打算在继续之前清理它:) 关于你的其他评论,就像我在@Chris 的回答中提到的那样,我无法让自定义错误正常工作。我正在尝试这个:&lt;customErrors mode="On" defaultRedirect="~/Error"&gt; &lt;error statusCode="404" redirect="~/Error/NotFound" /&gt; &lt;error statusCode="403" redirect="~/Error/Forbidden" /&gt; &lt;error statusCode="500" redirect="~/Error/InternalServerError" /&gt; &lt;/customErrors&gt;
  • 还不确定,但是这个问题已经在stackoverflow上得到了解答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多