Routing dla niestandardowych ASP.NET strona błędu MVC 404

Próbuję zrobić niestandardową stronę błędu HTTP 404, gdy ktoś wpisuje adres URL który nie wywołuje prawidłowej akcji lub kontrolera w ASP.NET MVC, zamiast wyświetlania ogólnego "Resource Not Found" ASP.NET błąd.

Nie chcę korzystać z sieci.config do obsługi tego.

Czy jest jakaś magia routingu, którą mogę zrobić, aby wyłapać błędne adresy URL?

Update: próbowałem udzielonej odpowiedzi, jednak nadal dostaję brzydki " zasób nie znaleziony" wiadomość.

Kolejna aktualizacja: ok, najwyraźniej coś się zmieniło w RC1. Próbowałem nawet specjalnie zalewkować 404 na HttpException i nadal daje mi stronę "zasób nie znaleziony".

Użyłem nawet funkcji zasobów MvcContrib i nic-ten sam problem. Jakieś pomysły?

Author: alex, 2009-02-16

9 answers

Po prostu dodaj catch all route na końcu tabeli tras i wyświetl dowolną stronę z nią.

Zobacz: Jak mogę zrobić catch całą trasę do obsługi' 404 page not found ' queries for ASP.NET MVC?

 9
Author: Alex Reitbort,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:09

Próbowałem włączyć niestandardowe błędy na serwerze produkcyjnym przez 3 godziny, wygląda na to, że znalazłem ostateczne rozwiązanie, jak to zrobić w ASP.NET MVC bez żadnych tras.

Aby włączyć błędy niestandardowe w ASP.NET aplikacja MVC, której potrzebujemy (IIS 7+):

  1. Konfiguracja własnych stron w web config w sekcji system.web:

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

    RemoteOnly oznacza to, że w sieci lokalnej zobaczysz prawdziwe błędy (bardzo przydatne podczas rozwoju). Możemy również przepisać stronę błędu dla każdego błędu kod.

  2. Ustaw parametr magic Response i kod stanu odpowiedzi (w module obsługi błędów lub w atrybutie obsługi błędów)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. Ustaw inne magiczne ustawienie w web config w sekcji system.webServer:

    <httpErrors errorMode="Detailed" />
    

To była ostatnia rzecz, którą znalazłem i po tym widzę niestandardowe błędy na serwerze produkcyjnym.

 100
Author: Andrew Orsich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-09 20:32:22

Uruchomiłem obsługę błędów, tworząc Kontroler błędów, który zwraca widoki w tym artykule. Musiałem też dodać "Catch All" do trasy w global.asax.

Nie widzę, jak dostanie się do żadnej z tych stron błędów, jeśli nie jest w sieci.config..? Moja Sieć.config musiał podać:

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

I jeszcze dodałem:

error statusCode="404" redirect="~/Error/NotFound"
 41
Author: Jack Smit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 00:32:41

Źródło

NotFoundMVC - zapewnia przyjazną dla użytkownika stronę 404, gdy kontroler, akcja lub trasa nie zostaną znalezione w Twoim ASP.NET aplikacja MVC3. Widok o nazwie NotFound jest renderowany zamiast domyślnego ASP.NET strona błędu.

Możesz dodać tę wtyczkę przez nuget używając: Install-Package NotFoundMvc

NotFoundMvc automatycznie instaluje się podczas uruchamiania aplikacji internetowej. Obsługuje wszystkie różne sposoby, na jakie zwykle rzuca się 404 HttpException ASP.NET MVC. Obejmuje to brak kontrolera, działania i trasy.

Instrukcja instalacji krok po kroku:

1-Kliknij prawym przyciskiem myszy na swoim projekcie i wybierz Zarządzaj pakietami Nuget...

2-Wyszukaj NotFoundMvc i zainstaluj go. Tutaj wpisz opis obrazka

3-Po zakończeniu instalacji do projektu zostaną dodane dwa pliki. Jak pokazano na zrzutach ekranu poniżej.

Tutaj wpisz opis obrazka

4-otwiera nowo dodany NotFound.CSHTML obecny w Views/Shared i modyfikować go do twojej woli. Teraz uruchom aplikację i wpisz nieprawidłowy adres url, a zostaniesz powitany przyjazną dla użytkownika stroną 404.

Tutaj wpisz opis obrazka

Koniec, użytkownicy otrzymają komunikat o błędzie jak Server Error in '/' Application. The resource cannot be found.

Mam nadzieję, że to pomoże:)

P. S : wyrazy uznania dla Andrew Davey za stworzenie tak wspaniałej wtyczki.

 26
Author: Yasser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 10:22:46

Spróbuj tego w sieci.config do zastąpienia stron błędów usługi IIS. Jest to najlepsze rozwiązanie, jak sądzę, i wysyła również poprawny kod stanu.

<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>

Więcej informacji z Tipila-Użyj własnych stron błędów ASP.NET MVC

 18
Author: Amila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 12:40:35

To rozwiązanie nie wymaga www.zmiany w pliku konfiguracyjnym lub przechwytywanie wszystkich tras.

Najpierw Utwórz taki Kontroler;

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

Następnie Utwórz widok w obszarze " widoki / błąd / indeks.cshtml " as;

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

Następnie dodaj następujący w globalnym pliku asax jak poniżej:

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

Jeśli po wykonaniu tej czynności nadal pojawi się strona błędu niestandardowego usługi IIS, upewnij się, że następujące sekcje są skomentowane(lub puste) w pliku konfiguracyjnym sieci web:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>
 15
Author: Sujeewa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 20:26:32

Jeśli pracujesz w MVC 4, możesz obejrzeć to rozwiązanie, zadziałało dla mnie.

Dodaj następującą metodę Application_Error do mojego 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();

Sam kontroler jest naprawdę prosty:

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

Sprawdź pełny kod źródłowy Mvc4CustomErrorPage na GitHub .

 5
Author: Duc Hoang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-25 09:30:54

Miałem ten sam problem, rzecz, którą musisz zrobić, to zamiast dodawać atrybut customErrors w sieci.plik konfiguracyjny w folderze widoki, trzeba go dodać w Internecie.plik konfiguracyjny w folderze głównym projektu

 0
Author: SmokeIT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-27 15:35:27

Oto prawdziwa odpowiedź, która pozwala w pełni dostosować stronę błędu w jednym miejscu. Nie trzeba modyfikować www.config lub utwórz osobny kod.

Działa również w MVC 5.

Dodaj ten kod do kontrolera:

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

Na podstawie http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

 0
Author: Andrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 16:13:23