哪些HTTP状态代码用于MVC错误处理

Tho*_*eil 12 asp.net-mvc web-config

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

问题:是否存在应该满足的HTTP状态代码的典型列表?

很多文章解释了如何进行MVC错误处理和自定义错误页面,但似乎只在其错误处理代码中显示了几个HTTP状态代码:403,404和500.那么HTTP状态代码:408就是一个例子?这应该涵盖吗?那吨其他状态代码 - 维基上的HTTP状态代码怎么样?

这可能听起来像一个愚蠢的问题,但我真的不知道答案,也无法找到相关信息.我在这里遗漏了什么,即应该只涵盖一部分状态代码吗?

如果它有帮助,下面就是我为MVC错误处理所做的事情.这段代码(到目前为止,我完成的测试很少)涵盖了404,以及所有50x类型的异常:

1在web.config中,以及我想要涵盖的每个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>  
Run Code Online (Sandbox Code Playgroud)

2错误控制器

    namespace MyApp.Controllers
    {
      public class ErrorController : Controller
      {
      public ActionResult Index()
      {
        return View();
      }
      public ActionResult Forbidden()
      {
        return View();
      }
      public ActionResult NotFound()
      {
        return View();
      }
Run Code Online (Sandbox Code Playgroud)

3用户友好的错误页面:

/Views/Shared/Index.cshtml
/Views/Shared/Forbidden.cshtml
/Views/Shared/NotFound.cshtml
Run Code Online (Sandbox Code Playgroud)

4 ELMAH用于记录

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

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

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

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

ubi*_*404 5

可能还有另一种方式:此解决方案使用1个自定义错误页面来处理所有类型(我认为?)

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

[2]:检查“ App_Start / FilterConfig.cs”看起来像这样:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}
Run Code Online (Sandbox Code Playgroud)

[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();
}
Run Code Online (Sandbox Code Playgroud)

[4]:添加“ Controllers / ErrorPageController.cs”

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
         Response.StatusCode = statusCode;
         ViewBag.StatusCode = statusCode + " Error";
         return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

[5]:在“视图/共享/Error.cshtml”中

@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
Run Code Online (Sandbox Code Playgroud)


Ale*_*yan 2

一个有趣的问题,恕我直言。

这三个错误(403、404 和 500)是使用标准浏览器访问您的网站的真实用户最常见的错误。

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

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

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

而且您也不应该为此创建用户友好的页面。

长话短说,别担心:)