Я использовал UrlRewriting. Сетевой модуль в течение пары лет теперь без любых проблем в Windows XP и Windows 2003. Я просто недавно обновил свой домашний ПК до Windows 7 и начал разрабатывать новый веб-сайт.
План состоял в том, чтобы использовать .html расширения и переписать их к их .aspx дубликатам с помощью UrlRewriting. Сетевой модуль. Все работает безупречно в 2008 VWD, но когда я пытаюсь выполнить его через IIS7, это - другая история.
Когда я пытаюсь получить доступ к странице через .html, переписывают, я больше не могу получать доступ к Page. Пользователь; это продолжает возвращать пустой указатель. Если я поразил использование страницы, это - .aspx расширение, Page. Пользователь правильно заполняется. Я должен также упомянуть, что у меня есть контроллер LoginView в моем Ведущем устройстве Page, и он страдает от тех же признаков: При доступе через .html расширение это показывает AnonyousTemplate; При использовании .aspx расширения это правильно показывает LoggedInTemplate. Я предполагаю, что эти два связаны.
[Примечание: я также попробовал URL без расширения, и они показывают ту же проблему]
Единственным путем я добрался, это для работы должно переключить пул приложений на Классика, который затем требует, чтобы я добавил ASP.NET ddl обработчик для .html расширения [иначе, это обрабатывается StaticFileHandler и подходит как 404 ошибки]. Однако я хотел бы, чтобы мое веб-приложение работало правильно за людьми, не имея необходимость возиться с IIS.
Таким образом, меня оставляют с несколькими вопросами:
[Примечание: Я просто попробовал .aspx => .aspx, переписывают, и он не показал проблему. Едва ли, что я хочу, но думал, что должен упомянуть это.]
Только что произошел прорыв с модулем UrlRewriting.Net. Это заставило его работать в Integrated Mode в IIS7:
<модули runAllManagedModulesForAllRequests="true">
После выяснения этого я провел поиск по "runAllManagedModulesForAllRequests" и первым, что всплыло, был блог Скотта Гатри (Scott Guthrie), в котором на самом деле говорится об использовании его для этой цели.
Другой подход, который, кажется, работает, заключается в удалении модуля Session и его замене, оставив флажок "Invoke only for requests to ASP.NET applications or managed handlers" снятым. В файле web.config это выглядит так:
<system.webServer>
<modules>
<remove name="Session" />
<add name="SessionManualAdd" type="System.Web.SessionState.SessionStateModule, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>
Похоже, проблема в том, что модуль Session не выполняется для, скажем, '*.htm' файлов, когда используется HttpContext.RewritePath, но удаление и считывание модуля таким образом приводит к тому, что обработчик Session выполняется для запроса.
Это решение было предложено в приведенной ниже ветке. К сожалению, Microsoft предпочла не полностью объяснить причины такого поведения: