ASP.NET MVC 2:直接访问404操作时避免循环

时间:2010-09-09 16:23:51

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

与许多使用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”)会导致无限循环。

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

1 个答案:

答案 0 :(得分:1)

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

查看示例here