【问题标题】:MVC 5 Error Handling Web.Config customErrorsMVC 5 错误处理 Web.Config customErrors
【发布时间】:2017-03-16 00:25:35
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:
    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>
    

    【讨论】:

    • 我喜欢这个答案,因为我更喜欢使用 Application_Error 进行全局错误处理。感谢您提供此信息。
    【解决方案2】:

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

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

    使用此选项会导致代码的执行因 404 错误而停止,错误处理程序会处理该错误。 (在这种情况下,在您的 web.config 中)

    【讨论】:

    • 现在确实会抛出 404 异常,但我的 web.config 没有发现异常。我得调查一下。不过谢谢。
    猜你喜欢
    • 2014-03-26
    • 2014-07-01
    • 1970-01-01
    • 2015-11-14
    • 2017-05-31
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多