我正在为我的MVC应用程序的错误处理代码中开发自定义错误页面。但我不清楚我打算涵盖哪些HTTP状态代码。
问题:是否有应该照顾的HTTP状态代码的典型列表?
很多文章解释了如何进行MVC错误处理和自定义错误页面,但似乎只在其错误处理代码中显示了几个HTTP状态代码:403,404和500。那么HTTP状态代码:408就是一个例子?这应该涵盖吗?那吨其他状态代码怎么样 - HTTP status codes on wiki
这可能听起来像一个愚蠢的问题,但我真的不知道答案,也找不到相关信息。我在这里遗漏了一些东西,即是否只应覆盖一部分状态代码?
如果有帮助,下面是我为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中,默认的错误页面包括:
如果这是微软设定的良好范围,那么我将以此为指导前进!
答案 0 :(得分:4)
可能有另一种方式:此解决方案使用1个自定义错误页面来处理所有类型(我认为?)
[1]:删除所有&#39; customErrors&#39; &安培; &#39; httpErrors&#39;来自Web.config
[2]:检查&#39; App_Start / FilterConfig.cs&#39;看起来像这样:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
[3]:在Global.asax&#39;添加此方法:
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]:添加&#39; Controllers / ErrorPageController.cs&#39;
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&#39;
中@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
答案 1 :(得分:2)
一个有趣的问题,恕我直言。
这三个错误(403,404和500)是使用标准浏览器访问您网站的真实用户可能发生的最常见错误。
另一方面,HTTP标准是为服务器和代理开发人员编写的,目的是定义双方应如何操作。当然,IE,Chrome,Firefox等标准浏览器以及Google或Bing机器人等标准机器人都能正确满足要求,但是某些专有的代理可能会发送格式错误的请求,并且标准提供了一组代码服务器应该发送这种情况。例如,如果遗漏了Content-Length字段,服务器将返回错误代码411.但是,您不应该为这种情况提供用户友好的页面。
代码408(请求超时)在标准中解释如下:
&#34;客户端在服务器准备等待的时间内没有产生请求。客户可以在以后的任何时候重复请求而不做任何修改。&#34;
并且您也不应该为用户友好的页面提供。
长话短说,不要担心:)
答案 2 :(得分:2)
我也想找出答案。我的代码看起来很像你的代码。这是一个很好的问题,只有很少的观点,我已经在这个问题上设置了赏金。到目前为止,我自己处理了以下代码:
<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>
我的推理如下:
总的来说,我觉得你应该处理那些你自己要使用的代码。问题是IIS会做各种奇怪的事情,我们需要处理一些不正确或无效的响应,例如我上面列出的403.14。
Here是IIS HTTP状态代码和子状态代码的完整列表,可能对我们的原因有用。我有一种感觉,403 Forbidden响应也应该得到支持,因为它似乎是IIS引发的一个相当突出的响应。
我在谷歌搜索时发现的一件有趣的事情是导航到:
yoursite/<script></script>
从IIS返回500内部服务器。我觉得这应该返回404. IIS错误页面没有告诉我们子状态代码是什么,我有兴趣知道我们如何找到,以便我们可以将500.Something重定向到404 Not Found页。
Here是ASP.NET MVC Boilerplate项目的GitHub页面的链接,我正在进行这项研究,你可以在那里查看我的代码。
答案 3 :(得分:1)
不要太依赖http状态代码。
在过去的几年里,我与一些糟糕的网络开发人员合作,他们在回复中错误地使用了这些开发人员。
我可能会在200-299之间寻找代码来表示成功。 我可能会查找代码&gt; 500来表示服务器故障。
除此之外,我使用一种自私的方法,即如果您要求您希望将一包数据返回给您,请检查数据。如果没有数据或数据不好,那么我肯定知道存在问题,因为我没有得到继续以名义方式运行我的应用程序所需的内容。