【问题标题】:ASP.NET MVC 2: Avoiding loop when accessing 404 action directlyASP.NET MVC 2:直接访问 404 操作时避免循环
【发布时间】:2011-04-10 08:39:13
【问题描述】:

像许多使用 ASP.NET MVC 的人一样,我使用类似于此处描述的方法实现了我自己的自定义 404 错误处理方案:How can I properly handle 404 in ASP.NET MVC?

(我实际上是在实施自己的解决方案后发现了该帖子,但我想出的实际上是相同的。)

但是,我遇到了一个问题,我不确定如何正确处理。这是我在 ErrorController 类中的 404 操作的样子:

    public ActionResult NotFound(string url)
    {
        url = (url ?? "");

        if (Request.Url.OriginalString.Contains(url) &&
            Request.Url.OriginalString != url)
        {
            url = Request.Url.OriginalString;
        }

        url = new Uri(url).AbsolutePath;

        // Check URL to prevent 'retry loop'
        if (url != "/Error/NotFound")
        {
            Response.StatusCode = (int)HttpStatusCode.NotFound;

            // Log 404 error just in case something important really is
            // missing from the web site...
            Elmah.ErrorSignal.FromCurrentContext().Raise(
                new HttpException(Response.StatusCode,
                    String.Format("Resource not found: {0}", url)));
        }

        return View();
    }

与我上面提到的另一个 StackOverflow 问题的答案不同的部分是如何防止“重试循环”。在其他其他答案中,阻止重试循环的代码只是在 ViewModel 上设置属性,这似乎并没有真正阻止循环。由于动作返回的是 404 响应代码,因此直接访问动作(通过在浏览器中输入“/Error/NotFound”)会导致无限循环。

所以这是我的问题:我是否错过了另一种更明显的方法来处理重试循环问题,或者我的方法是一种体面的方法?

【问题讨论】:

    标签: asp.net asp.net-mvc-2 http-status-code-404


    【解决方案1】:

    您可以通过在 web.config 文件中启用 customErrors 模式来处理错误,并将其设置为在发生任何错误时将错误重定向到您的控制器。

    看一个例子here

    【讨论】:

    • 实际上,不建议在 ASP.NET MVC 中使用 web.config 来处理 404 错误,因为 ASP.NET 在这种情况下会返回 302/Redirect 状态码(将用户重定向到您的错误页面) 而不是 404。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多