MVC 5错误处理Web.Config customErrors

时间:2016-11-02 15:50:45

标签: c# asp.net-mvc error-handling web-config

我正在探索不同类型的错误处理,并试图设置一些我自己的错误处理。

我的第一次尝试是在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>

2 个答案:

答案 0 :(得分:2)

public ActionResult PostAuditReport()
{
   Response.StatusCode = 404;
    return View(new PostAuditReportMessage { stage_directory = "PostAuditReport" });
}

上面的代码以它应该的方式工作。它为PostAuditReport的视图提供状态代码404而不是200.如果您想使用自定义消息提供404视图,您需要以下内容 -

的Global.asax.cs

诀窍是不要使用 重定向 进行404 - NotFound以避免往返。

以下代码将在浏览器中保留原始URL时呈现404的NotFound视图。

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);
    }
}

ErrorController

您需要为以下操作方法创建单独的视图。

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>

答案 1 :(得分:1)

您正在将响应的状态代码设置为404,但您仍然将视图作为响应提供。尝试使用异常导致404:

throw new HttpException(404, "Not Found");

使用此功能,您将导致代码执行停止,并出现404错误,错误处理会将错误提取。 (在这种情况下,在你的web.config中)