HttpHandler для 404 ошибка перестала работать после обновления 4.0 - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть HttpHandler, который обрабатывает 404 ошибки, которые я реализовал несколько лет назад как способ выполнения URL-маршрутизации. Если запрос отображается на действительной странице, он перенаправляется на эту страницу. В противном случае он возвращает 404. (Я знаю, что должен начать использовать новую функцию маршрутизации asp.net 4.0, но это займет некоторое время. Мне нужно, чтобы это работало как можно скорее.)

В IIS6 я сопоставил ошибку 404 с "/404.ashx". В файле web.config настраиваемые ошибки настраиваются так:

<customErrors mode="On" defaultRedirect="error.aspx">
  <error statusCode="404" redirect="/404.ashx"/>
</customErrors>

и обработчик http:

<httpHandlers>
  <add verb="GET" path="404.ashx" type="myNamespace.PageNotFoundHandler,myAssemblyName"/>
</httpHandlers>

Это работает годами - оно перестало работать, как только я сменил сайт на asp.net 4.0. Все было перекомпилировано для 4.0, и никаких изменений кода не было.

Теперь, когда я нажимаю на один из этих URL-адресов, которые раньше работали, я получаю пустую страницу с кодом ошибки 404. Если я удаляю отображение ошибок IIS 404, я получаю обычную старую страницу 404. Похоже, httphandler не вызывается.

У меня есть другой обработчик http, который работает нормально.

Я установил для элемента EnableExtensionlessUrls в реестре значение 0, как предлагалось здесь и в других местах.

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

Любые идеи о том, что я еще могу проверить?

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Изменение пула приложений по умолчанию на классический исправило это для меня.

1 голос
/ 15 февраля 2011

Вы можете проверить, является ли это атрибутом Verb, может быть, это POST или *?

Еще одним быстрым решением было бы добавить код в ваш обработчик событий Application_Error в вашем глобальном классе, вот так.

for (Ex = Server.GetLastError(); Ex != null; Ex = Ex.InnerException)
{
   if (Ex is HttpException && ((HttpException)Ex).GetHttpCode() == 404 && Context != null)
   {
       Context.Server.Transfer("~/404.ashx");
       return;
   }
}

Это исключило бы необходимость каких-либо настроек конфигурации внутри вашей веб-конфигурации, но оно могло бы вести себя несколько иначе, чем то, что вы используете в настоящее время, так как оно будет принимать идентификацию страницы запрашиваемой в данный момент страницы / файла вместо передачи по пути в строке запроса, как при обработке обычной страницы ошибок IIS 404.

...