Вопрос:

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

asp.net asp.net-mvc asp.net-mvc-routing http-status-code-404 custom-error-pages

145924 просмотра

10 ответа

4486 Репутация автора

Я пытаюсь создать настраиваемую страницу ошибки HTTP 404, когда кто-то вводит URL-адрес, который не вызывает допустимое действие или контроллер в ASP.NET MVC, вместо отображения общей ошибки ASP.NET «Ресурс не найден».

Я не хочу использовать web.config для этого.

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

Обновление: я попытался дать ответ, однако я все еще получаю уродливое сообщение "Ресурс не найден".

Еще одно обновление: ок, видимо что-то изменилось в RC1. Я даже пытался специально отловить 404 на, HttpExceptionи он все еще просто дает мне страницу «Ресурс не найден».

Я даже использовал функцию ресурса MvcContrib и ничего - такая же проблема. Есть идеи?

Автор: dswatik Источник Размещён: 16.02.2009 04:37

Ответы (10)


10 плюса

12304 Репутация автора

Решение

Просто добавьте команду catch all route в конец таблицы маршрутов и покажите с ней любую нужную страницу.

См .: Как сделать перехват всех маршрутов для обработки запросов «404 страница не найдена» для ASP.NET MVC?

Автор: Alex Reitbort Размещён: 16.02.2009 05:40

41 плюса

1973 Репутация автора

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

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

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

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

error statusCode="404" redirect="~/Error/NotFound"
Автор: Jack Smit Размещён: 17.08.2009 04:00

0 плюса

53 Репутация автора

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

Автор: SmokeIT Размещён: 27.12.2009 03:35

104 плюса

45231 Репутация автора

Я пытался включить пользовательские ошибки на рабочем сервере в течение 3 часов, кажется, я нашел окончательное решение, как это сделать в ASP.NET MVC без каких-либо маршрутов.

Для включения пользовательских ошибок в приложении ASP.NET MVC нам нужно (IIS 7+):

  1. Настройте пользовательские страницы в веб-конфигурации в system.webразделе:

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>
    

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

  2. Установите магический параметр Response и код состояния ответа (в модуле обработки ошибок или в атрибуте обработчика ошибок)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. Установите другой магический параметр в веб-конфигурации в system.webServerразделе:

    <httpErrors errorMode="Detailed" />
    

Это была последняя вещь, которую я нашел, и после этого я могу увидеть пользовательские ошибки на рабочем сервере.

Автор: Andrew Orsich Размещён: 16.09.2011 08:58

20 плюса

2099 Репутация автора

Попробуйте это в web.config, чтобы заменить страницы ошибок IIS. Это лучшее решение, я думаю, и оно также отправляет правильный код состояния.

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

Больше информации от Tipila - Используйте пользовательские страницы ошибок ASP.NET MVC

Автор: Amila Размещён: 15.03.2012 06:20

27 плюса

31244 Репутация автора

Источник

NotFoundMVC - предоставляет удобную для пользователя страницу 404, если в приложении ASP.NET MVC3 не найден контроллер, действие или маршрут. Представление с именем NotFound отображается вместо страницы ошибки ASP.NET по умолчанию.

Вы можете добавить этот плагин через Nuget, используя: Install-Package NotFoundMvc

NotFoundMvc автоматически устанавливается при запуске веб-приложения. Он обрабатывает все различные способы, которыми 404 HttpException обычно генерируется ASP.NET MVC. Это включает в себя отсутствующий контроллер, действие и маршрут.

Пошаговое руководство по установке:

1 - Щелкните правой кнопкой мыши свой проект и выберите «Управление пакетами Nuget» ...

2 - Поиск NotFoundMvcи установка. введите описание изображения здесь

3 - После завершения установки в ваш проект будут добавлены два файла. Как показано на скриншотах ниже.

введите описание изображения здесь

4 - Откройте недавно добавленный NotFound.cshtml подарок в Views / Shared и измените его по своему желанию. Теперь запустите приложение и введите неправильный URL-адрес, и вас встретит страница 404, удобная для пользователя.

введите описание изображения здесь

Нет больше, пользователи получат сообщение об ошибке, как Server Error in '/' Application. The resource cannot be found.

Надеюсь это поможет :)

PS: Спасибо Эндрю Дэйви за создание такого замечательного плагина.

Автор: Yasser Размещён: 03.11.2012 12:07

15 плюса

621 Репутация автора

Это решение не требует изменений файла web.config или отслеживания всех маршрутов.

Сначала создайте такой контроллер;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

Затем создайте представление в «Views / Error / Index.cshtml» as;

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

Затем добавьте следующее в файл Global asax, как показано ниже:

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

Если после этого вы по-прежнему получаете пользовательскую страницу ошибок IIS, убедитесь, что следующие разделы закомментированы (или пусты) в файле веб-конфигурации:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>
Автор: Sujeewa Размещён: 19.03.2013 09:58

5 плюса

51 Репутация автора

Если вы работаете в MVC 4, вы можете посмотреть это решение, оно сработало для меня.

Добавьте следующий метод Application_Error к моему Global.asax:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

Сам контроллер действительно прост:

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

Проверьте полный исходный код Mvc4CustomErrorPage на GitHub .

Автор: Duc Hoang Размещён: 25.05.2015 08:30

0 плюса

10379 Репутация автора

Вот верный ответ, который позволяет полностью настроить страницу ошибки в одном месте. Нет необходимости изменять web.config или создавать отдельный код.

Работает также в MVC 5.

Добавьте этот код в контроллер:

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

Основано на http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

Автор: Andrus Размещён: 22.07.2016 04:13

0 плюса

111 Репутация автора

Я буду говорить о некоторых конкретных случаях,

если вы используете «метод PageNotFound» в HomeController, как показано ниже

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

это не сработает. Но вы должны очистить теги Route, как показано ниже,

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

И если вы измените его как имя метода в web.config, он будет работать. Однако не забудьте сделать код как показано ниже в web.config

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
Автор: Furkan öztürk Размещён: 11.03.2019 04:00
Вопросы из категории :
32x32