Как сделать перехват всего маршрута для обработки запросов «страница 404 не найдена» для ASP.NET MVC?
-
10-07-2019 - |
Вопрос
Можно ли создать конечный маршрут, охватывающий все..и возвращает пользователя к представлению 404 в ASP.NET MVC?
ПРИМЕЧАНИЕ:Я не хочу настраивать это в настройках IIS.
Решение
Нашел ответ сам.
У Ричарда Дингвола есть отличная статья, в которой рассматриваются различные стратегии. Мне особенно нравится решение FilterAttribute. Я не фанат бросать исключения вокруг Вилли Нилли, так что я посмотрю, смогу ли я улучшить это:)
Для global.asax просто добавьте этот код в качестве вашего последнего маршрута для регистрации:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
Другие советы
Этот вопрос был первым, но более простой ответ был задан позже:
Маршрутизация для настраиваемой страницы ошибки 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>
Также вы можете обработать ошибку NOT FOUND в 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
}
}
Добавьте эти строки в корневой файл проекта 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>
Это может быть проблемой при использовании
throw new HttpException(404);
Если вы хотите это понять, я не знаю другого способа, кроме как редактировать вашу веб-конфигурацию.
Альтернативой созданию универсального маршрута является добавление метода Application_EndRequest
в MvcApplication
за Ответ Marco's Better-Than-Unicorns MVC 404 .
Внутри RouterConfig.cs
добавьте следующий фрагмент кода:
routes.MapRoute(
name: "Error",
url: "{id}",
defaults: new
{
controller = "Error",
action = "PageNotFound"
});
Если маршрут не может быть разрешен, то MVC-фреймворк выдаст ошибку 404. Лучше всего использовать фильтры исключений ... Создайте собственный фильтр исключений и создайте его следующим образом.
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html");
}
}