ASP.NET MVC 2: Избегание цикла при непосредственном доступе к действию 404 - PullRequest
0 голосов
/ 09 сентября 2010

Как и многие люди, использующие ASP.NET MVC, я реализовал собственную схему обработки ошибок 404, используя подход, аналогичный описанному здесь: Как правильно обрабатывать 404 в ASP.NET MVC?

(Я действительно обнаружил этот пост после реализации собственного решения, но то, что я придумал, практически идентично.)

Тем не менее, я столкнулся с одной проблемой, я не уверен, как правильно решить. Вот как выглядит мое действие 404 в моем классе ErrorController:

    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 Ответ

1 голос
/ 10 сентября 2010

вы можете обработать ошибки, включив режим customErrors в файле web.config и установив его для перенаправления ошибок на ваш контроллер при возникновении любых ошибок.

см. Пример здесь

...