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



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



Я не хочу использовать веб.конфигурация для обработки этого.



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



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



другие новости: ок, видимо что-то изменилось в RC1. Я даже пробовал специально ловушку 404 на HttpException и он все еще просто дает мне страницу "ресурс не найден".



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

681   9  

9 ответов:

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

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

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

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

  1. настройки пользовательских страниц в web config в :

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

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

  2. установить параметр magic Response и код состояния ответа (в модуле обработки ошибок или в атрибуте обработки ошибок)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. установите еще один волшебный параметр в web config под :

    <httpErrors errorMode="Detailed" />
    

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

Я получил свою обработку ошибок для работы, создав ErrorController, который возвращает представления в этой статье. Мне также пришлось добавить "поймать всех" на маршрут в глобальном масштабе.асакс.

Я не вижу, как он попадет на любую из этих страниц ошибок, если он не находится в Интернете.конфиг..? Моя Паутина.конфиг должен был указать:

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

и тогда я добавил:

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

источник

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

вы можете добавить этот плагин через nuget с помощью: Install-Package NotFoundMvc

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

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

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

2 - ищите NotFoundMvc и установить его. enter image description here

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

enter image description here

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

enter image description here

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

надеюсь, что это помогает :)

P. S: Слава Эндрю Дэйви для создания такого удивительного плагина.

попробуйте это в интернете.конфигурация для замены страниц ошибок 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

это решение не нуждается в интернете.изменения конфигурационного файла или маршруты перехвата.

во-первых, создать такой контроллер;

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");
    }
}

затем создайте представление в разделе " представления / ошибка / индекс.cshtml " as;

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

затем добавьте следующее в глобальный файл 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 после этого, убедитесь, что следующие разделы закомментированы (или пусты) в файле web config:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>

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

добавьте следующий метод Application_Error в my 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.

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

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

работает также в 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

Comments

    Ничего не найдено.