Я боролся с этой же проблемой, и вот чему я научился. На странице, на которую ссылается Рик Шотт, написано, что то, что вы помещаете в web.config, зависит от того, какую версию IIS вы развертываете. Используйте это для IIS 6 или IIS 7 в «классическом режиме»:
<httpModules>
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing,
Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
... но в IIS 7+ "интегрированный режим" добавьте это вместо:
<system.webServer>
<modules>
<remove name="UrlRoutingModule" />
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing,
Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</modules>
</system.webServer>
Одна важная вещь, которую я обнаружил, заключается в том, что, хотя последний может быть тем, что подходит для вашего IIS, первый - то, что работает в Visual Studio 2008. Поэтому вам, возможно, придется развернуть другой файл web.config из того, который вы разрабатываете с помощью .
Еще один полезный факт, который я обнаружил и который недостаточно хорошо задокументирован, заключается в том, что шаблон пути, который вы передаете в конструктор Route
, является относительным к приложению, а не относящимся к хосту, и он не должен начинаться с ведущего "/". или "~ /". Просто начните с имени первой подпапки или имени страницы, если оно находится на корневом уровне приложения.
Вы должны получить все это право только для того, чтобы оно могло вызвать ваш IRouteHandler
. Тогда вы можете беспокоиться о проблеме двух контекстов, если таковые имеются. У меня не было проблем с записью requestContext.HttpContext.Items
в классе обработчика и последующим чтением с Context.Items
на целевой странице.
Но так как вы получили сообщение об ошибке «не вернул IHttpHandler из его GetHttpHandler ()», похоже, что это работает, по крайней мере, на вашем рабочем столе. Тогда возникает вопрос: почему вы преобразуете свой экземпляр страницы как IDisplay, а не как IHttpHandler? Это кажется очевидным первым, что нужно изменить. Я попытался привести возвращение как Page, и вместо этого, похоже, просто требуется прямое приведение к IHttpHandler.