Как должны работать пользовательские ошибки asp.net?

Я реализовал пользовательские ошибки в своем приложении asp.net mvc, следуя этой статье. . Я заметил, что если я перейду на http://www.mysite.com/some-non-existent-controller-and-action Я получаю страницу с ошибкой 404, как и ожидалось. Однако, глядя на то, что происходит с firebug, я вижу, что я получаю ответ 302 Found для несуществующей страницы, который затем перенаправляет на мою пользовательскую страницу ошибок, которая затем возвращается с 404 (и отображает пользовательскую страницу ошибки). Это правильно? Я не думаю, что 302, который возвращается первым, очень хорош, особенно с точки зрения SEO, и, возможно, мне нужно еще раз подумать о том, как я это реализовал.


person s1mm0t    schedule 24.06.2010    source источник
comment
Я никогда не замечал этого раньше, но я только что подтвердил, что это происходит в моем приложении MVC2 с реализованными пользовательскими ошибками.   -  person Dustin Laine    schedule 25.06.2010
comment
Глядя на некоторые решения, я не верю, что вы можете использовать их и customErrors одновременно. Я хотел бы выяснить, как заставить customErrors возвращать прямой 404 без 302. Есть ли способ сделать это?   -  person Dustin Laine    schedule 25.06.2010


Ответы (2)


Лучшее руководство (я думаю) по обработке ошибок 404 можно найти в этот ответ. По сути, существует несколько способов возникновения ошибки 404:

  1. Маршрут не существует — он соответствует правилу захвата всех.
  2. Маршрут совпал, но контроллер не найден — для правил с динамическими именами контроллеров — {controller}/{action}/{parameter} правило.
  3. Маршрут найден, но действие не найдено — обработано переопределением HandleUnknownAction.
  4. Найдены маршрут и действие, но не удалось преобразовать параметры — соответствие правилу охвата всех.

Связанный ответ в основном устанавливает контроллер, который может быть выполнен из любой точки кода без перезаписи URL-адреса - это то, что вы хотите.

Кроме того, вам также следует подумать об обработке необработанных исключений и неверных URL-адресов (например, тех, которые содержат небезопасные символы, такие как угловые скобки). В этом конкретном случае вам нужно переписать URL-адрес, иначе вы вообще не сможете отобразить ответ. Эти конкретные запросы довольно сложны, я писал об этом в блоге здесь.

person Igor Zevaka    schedule 25.06.2010
comment
Спасибо, выглядит хорошо. Я внимательно посмотрю и отвечу - person s1mm0t; 25.06.2010

Следовали ли вы совету внизу страницы, добавляя «универсальный» маршрут, который соответствует вашему действию «NotFound»:

routes.MapRoute("Catch All", "{*path}",
    new { controller = "Error", action = "NotFound" });

Если вы сделаете это самым последним маршрутом, который вы добавляете, любые «неизвестные» URL-адреса будут отображаться непосредственно в вашем действии «NotFound» на ErrorController, и вы можете просто вернуть представление «not found» прямо оттуда, никаких перенаправлений не требуется.

person Dean Harding    schedule 25.06.2010