Как сделать перехват всех маршрутов для обработки запросов «404 страница не найдена» для ASP.NET MVC? - PullRequest
48 голосов
/ 22 ноября 2008

Можно ли создать окончательный маршрут, который перехватит все .. и перенаправит пользователя в представление 404 в ASP.NET MVC?

ПРИМЕЧАНИЕ. Я не хочу устанавливать это в настройках IIS.

Ответы [ 8 ]

72 голосов
/ 22 ноября 2008

Сам нашел ответ.

Ричард Дингволл имеет отличную статью про различные стратегии. Мне особенно нравится решение FilterAttribute. Я не фанат бросать исключения вокруг Willy Nilly, поэтому я посмотрю, смогу ли я улучшить это:)

Для global.asax просто добавьте этот код в качестве вашего последнего маршрута для регистрации:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );
19 голосов
/ 21 сентября 2011

Этот вопрос был первым, но более простой ответ пришел позже:

Маршрутизация для пользовательской страницы ошибки ASP.NET MVC 404

Я получил обработку ошибок, создав ErrorController, который возвращает взгляды в этой статье. Мне также пришлось добавить «Catch All» к маршруту в global.asax.

Я не вижу, как он попадет на любую из этих страниц с ошибками, если это не так в Web.config ..? Мой Web.config должен был указать:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

и затем я также добавил:

error statusCode="404" redirect="~/Error/NotFound"

Надеюсь, это поможет.

Мне нравится этот способ сейчас, потому что он так прост:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>
6 голосов
/ 06 марта 2016

Также вы можете обработать НЕ НАЙТИ ошибку в Global.asax.cs как показано ниже

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}
4 голосов
/ 18 февраля 2015

Добавьте эти строки в корневой файл вашего проекта web.config.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

3 голосов
/ 22 ноября 2008

Это может быть проблемой при использовании

throw new HttpException(404);

Если вы хотите это уловить, я не знаю другого способа, кроме редактирования вашей веб-конфигурации.

1 голос
/ 07 октября 2015

Внутри RouterConfig.cs добавьте следующий код:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });
1 голос
/ 25 августа 2012

Альтернативой созданию универсального маршрута является добавление метода Application_EndRequest к вашему MvcApplication за Marco's Better-Than-Unicorns MVC 404 Ответ .

0 голосов
/ 18 мая 2015

Если маршрут не может быть разрешен, то MVC framework будет через ошибку 404. Лучше всего использовать фильтры исключений ... Создайте собственный фильтр исключений и создайте его следующим образом.

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
...