Asp.net mvc MVC错误处理需要覆盖哪些HTTP状态代码

Asp.net mvc MVC错误处理需要覆盖哪些HTTP状态代码,asp.net-mvc,web-config,Asp.net Mvc,Web Config,我目前正在为我的MVC应用程序开发错误处理代码中的自定义错误页。但我不清楚我要涵盖哪些HTTP状态代码 问题:是否有一个典型的HTTP状态代码列表可以满足要求 许多文章解释了如何进行MVC错误处理和自定义错误页面,但似乎只在错误处理代码中显示了几个HTTP状态代码:403、404和500。以HTTP状态代码408为例如何?这应该包括在内吗?那一吨其他状态代码呢- 这听起来像一个愚蠢的问题,但我真的不知道答案,也找不到关于这个问题的信息。我是否遗漏了一些内容,即是否只应涵盖状态代码的子集 如果有帮

我目前正在为我的MVC应用程序开发错误处理代码中的自定义错误页。但我不清楚我要涵盖哪些HTTP状态代码

问题:是否有一个典型的HTTP状态代码列表可以满足要求

许多文章解释了如何进行MVC错误处理和自定义错误页面,但似乎只在错误处理代码中显示了几个HTTP状态代码:403、404和500。以HTTP状态代码408为例如何?这应该包括在内吗?那一吨其他状态代码呢-

这听起来像一个愚蠢的问题,但我真的不知道答案,也找不到关于这个问题的信息。我是否遗漏了一些内容,即是否只应涵盖状态代码的子集

如果有帮助,下面是我为MVC错误处理所做的工作。这段代码(到目前为止,我所做的测试很少)涵盖了404和所有50x类型的异常:

web.config中的1,以及我要介绍的每个HTTP状态代码的条目

<httpErrors errorMode="Custom" existingResponse="Replace" >
  <remove statusCode="403" />
  <remove statusCode="404" />
  <remove statusCode="500" />
  <error statusCode="403" responseMode="ExecuteURL" path="/Error/Forbidden" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Error" />
</httpErrors>  
3用户友好的错误页面:

/Views/Shared/Index.cshtml
/Views/Shared/Forbidden.cshtml
/Views/Shared/NotFound.cshtml
4用于伐木的ELMAH

截至2015年11月2日的进一步调查结果

一些我刚刚发现的东西,一直盯着我的脸,我错过了。。。在IIS中,涵盖的默认错误页面包括:

  • 401–未经授权
  • 403–禁止
  • 404–未找到
  • 405–方法不允许
  • 406–不可接受
  • 412–前提条件失败
  • 500–内部服务器错误
  • 501–未实施
  • 502–坏网关

如果这是微软设定的好范围,那么我将以此作为前进的指南

一个有趣的问题,伊姆霍

这三个错误(403、404和500)是真实用户使用标准浏览器访问站点时可能发生的最常见错误

另一方面,HTTP标准是为服务器和代理开发人员编写的,目的是定义双方应该如何操作。当然,IE、Chrome、Firefox等标准浏览器以及Google或Bing机器人等标准机器人都能正确满足要求,但一些专有的书面代理可能会发送格式不正确的请求,标准提供了服务器在这种情况下应发送的代码集。例如,如果内容长度字段丢失,服务器将返回错误代码411。但是,您不应该为这种情况提供用户友好的页面

代码408(请求超时)在标准中解释如下:

“客户端在服务器准备等待的时间内没有生成请求。客户端可以在以后的任何时间重复请求而不进行修改。”

而且这也不是一个你应该为其创建用户友好页面的情况


长话短说,别担心:)

我也在努力找出答案。我的密码和你的很像。这是一个观点很少的好问题,我已经在这个问题上悬赏了。到目前为止,我本人处理过以下代码:

<system.webServer>
  <!-- Custom error pages -->
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <!-- Redirect IIS 400 Bad Request responses to the error controllers bad request action. -->
    <remove statusCode="400" />
    <error statusCode="400" responseMode="ExecuteURL" path="/error/badrequest" />
    <!-- Redirect IIS 401 Unauthorized responses to the error controllers unauthorized action. -->
    <remove statusCode="401" />
    <error statusCode="401" responseMode="ExecuteURL" path="/error/unauthorized" />
    <!-- Redirect IIS 403.14 Forbidden responses to the error controllers not found action. 
         A 403.14 happens when navigating to an empty folder like /Content and directory browsing is turned off
         See http://rehansaeed.co.uk/securing-the-aspnet-mvc-web-config/ and http://www.troyhunt.com/2014/09/solving-tyranny-of-http-403-responses.html -->
    <error statusCode="403" subStatusCode="14" responseMode="ExecuteURL" path="/error/notfound" />
    <!-- Redirect IIS 404 Not Found responses to the error controllers not found action. -->
    <remove statusCode="404" />
    <error statusCode="404" responseMode="ExecuteURL" path="/error/notfound" />
    <!-- Redirect IIS 500 Internal Server Error responses to the error controllers internal server error action. -->
    <remove statusCode="500" />
    <error statusCode="500" responseMode="ExecuteURL" path="/error" />
  </httpErrors>
</system.webServer>

我的理由如下:

  • 400-控制器内置了BadRequest()方法,当传递给操作的参数无效时,您可能希望返回该方法
  • 401-将Authorize属性应用于控制器或操作会导致401未经授权的响应。控制器还内置了Unauthorized()方法
  • 403.14-将这些重定向到404未找到响应,因为禁止响应完全是错误的(有关更多信息,请参阅和)
  • 404-当用户浏览到未找到的页面时抛出
  • 500-发生灾难性错误时抛出
总的来说,我觉得你应该处理那些你自己将要使用的代码。问题是IIS会做各种奇怪的事情,我们需要处理一些不正确或无效的响应,比如上面列出的403.14i

是IIS HTTP状态代码和子状态代码的完整列表,可能对我们的事业有用。我觉得403禁止响应也应该得到支持,因为它似乎是IIS抛出的一个相当突出的响应

我在谷歌搜索时发现了一件有趣的事情,那就是导航到:

yoursite/<script></script>
yoursite/
从IIS返回500个内部服务器。我觉得这应该返回404。IIS错误页面没有告诉我们子状态代码是什么,我想知道如何找到,这样我们就可以将500.Something重定向到404未找到页面


是指向ASP.NET MVC样板项目GitHub页面的链接,我正在为此进行研究,您可以在这里查看我的代码。

不要太依赖http状态代码

在过去的几年里,我与一些糟糕的web开发人员一起工作,他们在回答问题时错误地使用了它们

我可能会寻找200-299范围内的代码以指示成功。 我可能会查找大于500的代码以指示服务器故障


除此之外,我还使用了一种自私的方法,即,如果您提出了一个请求,希望将数据包返回给您,那么请检查数据。如果没有数据或数据不好,那么我肯定知道有问题,因为我没有获得继续以正常方式运行应用程序所需的信息。

可能还有另一种方法:此解决方案使用一个自定义错误页来处理所有类型(我想是吧?)

[1] :从Web.config中删除所有“customErrors”和“httpErrors”

[2] :选中“App\u Start/FilterConfig.cs”如下所示:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}
[3] :在“Global.asax”中添加此方法:

public void Application_Error(Object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    var routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorPage");
    routeData.Values.Add("action", "Error");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    Response.TrySkipIisCustomErrors = true;
    IController controller = new ErrorPageController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();
}
[4] :添加“控制器/ErrorPageController.cs”

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
         Response.StatusCode = statusCode;
         ViewBag.StatusCode = statusCode + " Error";
         return View();
    }
}
[5] :在“视图/共享”中
public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
         Response.StatusCode = statusCode;
         ViewBag.StatusCode = statusCode + " Error";
         return View();
    }
}
@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}

<h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>

//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace