У меня есть следующий маршрут в нижней части моего global.asax:
//404 ERRORS:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Error", action = "PageNotFound" }
);
Который отлично работает в Visual Studio, но в production я получаю страницу ошибки IIS.
Разве этот маршрут не должен ловить любой URL, не пойманный другими, поэтому с точки зрения IIS не будет 404? Есть ли что-то еще, что мне нужно сделать в web.config?
Примечание: я не хочу перенаправлять на конкретный 404 URL; скорее я предоставляю страницу 404 ошибки по запрошенному URL (я считаю, что это правильный подход с точки зрения удобства использования).
UPDATE
В моем контроллере Error я устанавливаю Response.StatusCode = 404;
, что, похоже, и является проблемой. Когда я удаляю это и снова развертываю в production, я снова получаю дружественные страницы ошибок. Однако я считаю, что мне действительно нужен статус 404 в заголовке HTTP - в целях SEO - поэтому мой вопрос теперь звучит так:
ПЕРЕИЗДАННЫЙ ВОПРОС
Как/почему IIS перехватывает ответ и отправляет свою нестандартную ошибку 404, и как мне это предотвратить?
**РЕШЕНИЕ**
Dommer получает приз за предложение Response.TrySkipIisCustomErrors=true;
, которое (я думаю) было необходимым. Но было еще 2 ключевых детали:
Заставляем это работать везде
Поскольку некоторые URL могут быть сопоставлены с маршрутами, отличными от "404-PageNotFound", но содержащими недопустимые параметры, и поскольку я не хочу перенаправлять на страницу 404, я создал это действие в моем базовом контроллере:
[HandleError]
public ActionResult NotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));
}
и в любом контроллере-действии, наследующем базовый, мне просто нужно вызывать это действие всякий раз, когда я поймаю недопустимый параметр маршрута:
return NotFound();
примечание: Не RedirectToAction()
Начинка на торте:
Модель, которую я сгенерировал и передал в представление, предназначена для передачи словесной части URL в нашу поисковую систему и отображения трех лучших результатов в качестве предложений на дружественной странице 404.