MVC: 404 маршрут не работает должным образом в production

У меня есть следующий маршрут в нижней части моего 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 ключевых детали:

  • пользовательские ошибки должны быть включены в web.config (duh!), и
  • действие 404 должно иметь атрибут [HandleErrors].

Заставляем это работать везде
Поскольку некоторые 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.

5
задан Faust 18 October 2011 в 19:16
поделиться