Как должны работать пользовательские ошибки asp.net? - PullRequest
1 голос
/ 25 июня 2010

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

Ответы [ 2 ]

1 голос
/ 25 июня 2010

Лучшее руководство (я думаю) по обработке 404-х можно найти в этом ответе .В принципе, существует 40 способов, которыми могут происходить события 404:

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

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

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

0 голосов
/ 25 июня 2010

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

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

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

...