Как и многие люди, использующие 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» в браузере) вызывает бесконечный цикл.
Итак, вот мой вопрос: я пропустил другой, более очевидный способ справиться с проблемой повторения цикла, или мой подход - приличный способ сделать это?