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?
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?
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+):
-
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. -
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;
-
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.
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"
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
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.
3-Po zakończeniu instalacji do projektu zostaną dodane dwa pliki. Jak pokazano na zrzutach ekranu poniżej.
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.
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.
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
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>
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 .
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
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
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