C# MVC 判断成功的 Http 状态码
C# MVC Determine Successful Http Status Code
我有一些代码可以根据收到的错误为我显示特定视图执行错误处理。
我的代码如下所示:
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 mode="On" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/NotFound" />
<error statusCode="403" redirect="~/Error/Forbidden" />
<error statusCode="500" redirect="~/Error/InternalServerError" />
</customErrors>
都没有运气
您不一定需要涵盖所有错误代码(从 400 到 500)。
看看:
并且最好使用管道中已有的处理程序,而不是您在 Application_EndRequest()
中正在执行的处理程序。我的意思是你应该在 web.config.
中使用 <httpErrors ...
and/or <customErrors
<httpErrors>
配置 IIS,而 <customErrors>
配置 ASP.NET
资料来源:
示例:How can I properly handle 404 in ASP.NET MVC?
另一篇很棒的文章:Demystifying ASP.NET MVC 5 Error Pages and Error Logging
这篇文章详细解释了如何正确设置 404 和 500:Custom error pages in ASP.NET MVC. Easy, right?
嗯,我不确定错误代码,但您不应该那样复制和粘贴代码。
创建一个函数。
protected void Application_EndRequest()
{
var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode);
if (!response.IsSuccessStatusCode)
{
switch (response.StatusCode)
{
case HttpStatusCode.BadRequest:
ErrorAction("BadRequest");
break;
case HttpStatusCode.NotFound:
ErrorAction("NotFound");
break;
case HttpStatusCode.InternalServerError:
ErrorAction("InternalServerError");
break;
case HttpStatusCode.Forbidden:
ErrorAction("Forbidden");
break;
default:
ErrorAction("GenericError");
break;
}
}
}
// Sends a request to the ErrorController
private void ErrorAction(string action)
{
var rd = new RouteData();
IController c = new ErrorController();
Response.Clear();
rd.Values["controller"] = "Error";
rd.Values["action"] = action;
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
该代码建议您可以完全消除不同的 ErrorController 操作,只需将查询字符串中的 StatusCode 传递给单个操作方法。
我有一些代码可以根据收到的错误为我显示特定视图执行错误处理。
我的代码如下所示:
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 mode="On" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/NotFound" />
<error statusCode="403" redirect="~/Error/Forbidden" />
<error statusCode="500" redirect="~/Error/InternalServerError" />
</customErrors>
都没有运气
您不一定需要涵盖所有错误代码(从 400 到 500)。
看看:
并且最好使用管道中已有的处理程序,而不是您在 Application_EndRequest()
中正在执行的处理程序。我的意思是你应该在 web.config.
<httpErrors ...
and/or <customErrors
<httpErrors>
配置 IIS,而 <customErrors>
配置 ASP.NET
资料来源:
示例:How can I properly handle 404 in ASP.NET MVC?
另一篇很棒的文章:Demystifying ASP.NET MVC 5 Error Pages and Error Logging
这篇文章详细解释了如何正确设置 404 和 500:Custom error pages in ASP.NET MVC. Easy, right?
嗯,我不确定错误代码,但您不应该那样复制和粘贴代码。
创建一个函数。
protected void Application_EndRequest()
{
var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode);
if (!response.IsSuccessStatusCode)
{
switch (response.StatusCode)
{
case HttpStatusCode.BadRequest:
ErrorAction("BadRequest");
break;
case HttpStatusCode.NotFound:
ErrorAction("NotFound");
break;
case HttpStatusCode.InternalServerError:
ErrorAction("InternalServerError");
break;
case HttpStatusCode.Forbidden:
ErrorAction("Forbidden");
break;
default:
ErrorAction("GenericError");
break;
}
}
}
// Sends a request to the ErrorController
private void ErrorAction(string action)
{
var rd = new RouteData();
IController c = new ErrorController();
Response.Clear();
rd.Values["controller"] = "Error";
rd.Values["action"] = action;
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
该代码建议您可以完全消除不同的 ErrorController 操作,只需将查询字符串中的 StatusCode 传递给单个操作方法。