Как я могу обработать ошибки 404 без того, чтобы фреймворк вызывал код ошибки Exception 500?





http://jason.whitehorn.ws/2008/06/17/Friendly-404-Errors-In-ASPNET-MVC.aspx дает следующее объяснение:
Добавьте правило маршрутизации с подстановочными знаками в качестве последнего правила:
routes.MapRoute("Error",
"{*url}",
new { controller = "Error", action = "Http404" });
Любой запрос, который не соответствует другому правилу, направляется к действию Http404 контроллера ошибок, которое вам также необходимо настроить:
public ActionResult Http404(string url) {
Response.StatusCode = 404;
ViewData["url"] = url;
return View();
}
Единственная проблема здесь в том, что так много всего соответствует типичному маршруту / {controller} / {action} / {id}. Чтобы обойти проблему, я явно определил все свои маршруты и избавился от них.
К сожалению, ссылка не работает. Даже jason.whitehorn.ws недоступен: |
Это нормально для ситуаций, когда маршруты не совпадают, но не помогает, например, когда идентификатор недействителен ...
@JasonWhitehorn снова 404
Вы также можете переопределить HandleUnknownAction в своем контроллере в тех случаях, когда запрос действительно соответствует контроллеру, но не соответствует действию. Реализация по умолчанию вызывает ошибку 404.
Отличная идея. Ознакомьтесь с этим решением, которое включает переопределение HandleUnknownAction: stackoverflow.com/questions/619895/…
выбросить новое исключение HttpException (404, «Ресурс не найден»);
С MVC 3 вы можете вернуть HttpNotFound (), чтобы правильно вернуть 404.
Так:
public ActionResult Download(string fontName)
{
FontCache.InitalizeFonts();
fontName = HttpUtility.UrlDecode(fontName);
var font = FontCache.GetFontByName(fontName);
if (font == null)
return HttpNotFound();
return View(font);
}
Просто к вашему сведению, вышеупомянутая связанная публикация возвращает 404 (о ирония). Новый адрес: jason.whitehorn.ws/2008/06/17/…