Я реализовал пользовательские ошибки в своем приложении asp.net mvc, следуя этой статье. а>. Я заметил, что если я перейду на http://www.mysite.com/some-non-existent-controller-and-action Я получаю страницу с ошибкой 404, как и ожидалось. Однако, глядя на то, что происходит с firebug, я вижу, что я получаю ответ 302 Found для несуществующей страницы, который затем перенаправляет на мою пользовательскую страницу ошибок, которая затем возвращается с 404 (и отображает пользовательскую страницу ошибки). Это правильно? Я не думаю, что 302, который возвращается первым, очень хорош, особенно с точки зрения SEO, и, возможно, мне нужно еще раз подумать о том, как я это реализовал.
Как должны работать пользовательские ошибки asp.net?
Ответы (2)
Лучшее руководство (я думаю) по обработке ошибок 404 можно найти в этот ответ. По сути, существует несколько способов возникновения ошибки 404:
- Маршрут не существует — он соответствует правилу захвата всех.
- Маршрут совпал, но контроллер не найден — для правил с динамическими именами контроллеров —
{controller}/{action}/{parameter}
правило. - Маршрут найден, но действие не найдено — обработано переопределением
HandleUnknownAction
. - Найдены маршрут и действие, но не удалось преобразовать параметры — соответствие правилу охвата всех.
Связанный ответ в основном устанавливает контроллер, который может быть выполнен из любой точки кода без перезаписи URL-адреса - это то, что вы хотите.
Кроме того, вам также следует подумать об обработке необработанных исключений и неверных URL-адресов (например, тех, которые содержат небезопасные символы, такие как угловые скобки). В этом конкретном случае вам нужно переписать URL-адрес, иначе вы вообще не сможете отобразить ответ. Эти конкретные запросы довольно сложны, я писал об этом в блоге здесь.
Следовали ли вы совету внизу страницы, добавляя «универсальный» маршрут, который соответствует вашему действию «NotFound»:
routes.MapRoute("Catch All", "{*path}",
new { controller = "Error", action = "NotFound" });
Если вы сделаете это самым последним маршрутом, который вы добавляете, любые «неизвестные» URL-адреса будут отображаться непосредственно в вашем действии «NotFound» на ErrorController
, и вы можете просто вернуть представление «not found» прямо оттуда, никаких перенаправлений не требуется.