MVC 5 错误处理 Web.Config 个自定义错误
MVC 5 Error Handling Web.Config customErrors
我正在探索不同类型的错误处理,并试图设置一些我自己的错误处理。
我的第一次尝试是使用 web.config 文件中的 customErrors 部分。我设置了两个错误部分。一个用于 404 错误,另一个用于 403。在我的一个控制器中,我设置了 Response.StatusCode = 404;
并且邮递员收到 404 状态。但是,我的页面已提供并且状态从未被捕获。
也许我遗漏了什么。下面是我的示例。
控制器:
public ActionResult PostAuditReport()
{
Response.StatusCode = 404;
return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}
Web.Config:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.cshtml">
<error statusCode="404" redirect="~/Error/NotFound"/>
<error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>
您正在将响应的状态代码设置为 404,但您仍然将视图作为响应。尝试使用异常引发 404:
throw new HttpException(404, "Not Found");
使用它,您将导致代码的执行因 404 错误而停止,错误处理将拾取该错误。 (在这种情况下,在您的 web.config 中)
public ActionResult PostAuditReport()
{
Response.StatusCode = 404;
return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}
以上代码按应有的方式工作。它为 PostAuditReport 的视图提供状态代码 404 而不是 200。如果你想为 404 视图提供自定义消息,你需要以下 -
Global.asax.cs
诀窍是不要对 404 - NotFound 使用 Redirect 以避免往返。
以下代码将呈现 404 的 NotFound 视图,同时在浏览器中保持原始 URL。
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Log exception to database if you want to.
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "NotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
错误控制器
您需要为以下操作方法创建单独的视图。
public class ErrorController : Controller
{
[AllowAnonymous]
public ActionResult BadRequest()
{
Response.StatusCode = 403;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult NotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult Error()
{
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
*仅供参考:您不能指向 Error.cshtml。默认情况下,由于安全原因,IIS 不会提供 .cshtml。
应该是这样的-
<customErrors defaultRedirect="~/Error/Error" mode="On">
<error statusCode="404" redirect="~/Error/NotFound"/>
<error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>
我正在探索不同类型的错误处理,并试图设置一些我自己的错误处理。
我的第一次尝试是使用 web.config 文件中的 customErrors 部分。我设置了两个错误部分。一个用于 404 错误,另一个用于 403。在我的一个控制器中,我设置了 Response.StatusCode = 404;
并且邮递员收到 404 状态。但是,我的页面已提供并且状态从未被捕获。
也许我遗漏了什么。下面是我的示例。
控制器:
public ActionResult PostAuditReport()
{
Response.StatusCode = 404;
return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}
Web.Config:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.cshtml">
<error statusCode="404" redirect="~/Error/NotFound"/>
<error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>
您正在将响应的状态代码设置为 404,但您仍然将视图作为响应。尝试使用异常引发 404:
throw new HttpException(404, "Not Found");
使用它,您将导致代码的执行因 404 错误而停止,错误处理将拾取该错误。 (在这种情况下,在您的 web.config 中)
public ActionResult PostAuditReport()
{
Response.StatusCode = 404;
return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}
以上代码按应有的方式工作。它为 PostAuditReport 的视图提供状态代码 404 而不是 200。如果你想为 404 视图提供自定义消息,你需要以下 -
Global.asax.cs
诀窍是不要对 404 - NotFound 使用 Redirect 以避免往返。
以下代码将呈现 404 的 NotFound 视图,同时在浏览器中保持原始 URL。
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Log exception to database if you want to.
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "NotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
错误控制器
您需要为以下操作方法创建单独的视图。
public class ErrorController : Controller
{
[AllowAnonymous]
public ActionResult BadRequest()
{
Response.StatusCode = 403;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult NotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult Error()
{
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
*仅供参考:您不能指向 Error.cshtml。默认情况下,由于安全原因,IIS 不会提供 .cshtml。
应该是这样的-
<customErrors defaultRedirect="~/Error/Error" mode="On">
<error statusCode="404" redirect="~/Error/NotFound"/>
<error statusCode="403" redirect="~/Error/BadRequest"/>
</customErrors>