繁体   English   中英

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

[英]Which HTTP Status Codes to cover for MVC error handling

我正在为我的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>  

2错误控制器

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

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错误的网关

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

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

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

[2]:检查'App_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]:添加'Controllers / ErrorPageController.cs'

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

[5]:在'Views / Shared / 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

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

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

另一方面,HTTP标准是为服务器和代理开发人员编写的,以便定义双方应如何操作。 当然,IE,Chrome,Firefox等标准浏览器以及Google或Bing机器人等标准机器人都能正确满足要求,但是某些专有的代理可能会发送格式错误的请求,并且标准提供了一组代码服务器应该发送这种情况。 例如,如果遗漏了Content-Length字段,则服务器返回错误代码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响应。 控制器还内置了Unauthorized()方法。
  • 403.14 - 将这些重定向到404 Not Found响应作为Forbidden是完全错误的(有关更多信息,请参阅保护您的web.configTroy Hunt的博客 )。
  • 404 - 当用户浏览未找到的页面时抛出。
  • 500 - 当事情发生灾难性错误时抛出。

总的来说,我觉得你应该处理那些你自己要使用的代码。 问题是IIS会做各种奇怪的事情,我们需要处理一些不正确或无效的响应,例如上面列出的403.14。

以下是IIS HTTP状态代码和子状态代码的完整列表,这些代码可能对我们的原因有用。 我有一种感觉,403 Forbidden响应也应该得到支持,因为它似乎是IIS引发的一个相当突出的响应。

我在谷歌搜索时发现的一个有趣的事情是导航到:

yoursite/<script></script>

从IIS返回500内部服务器。 我觉得这应该返回404. IIS错误页面没有告诉我们子状态代码是什么,我有兴趣知道我们如何找到,以便我们可以将500.Something重定向到404 Not Found页。

是一个指向ASP.NET MVC Boilerplate项目的GitHub页面的链接,我正在进行这项研究,你可以在这里查看我的代码。

不要过分依赖http状态代码。

在过去的几年里,我与一些糟糕的网络开发人员合作过,他们在回复中错误地使用了它们。

我可以在200-299之间查找代码以表示成功。 我可能会查找代码> 500来表示服务器故障。

除此之外,我使用一种自私的方法,即如果您要求您希望将一包数据返回给您,请检查数据。 如果没有数据或者数据不好那么我肯定知道存在问题,因为我没有得到我需要继续以名义方式运行我的应用程序。

暂无
暂无

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

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