【发布时间】: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