Проблемы перезаписи URL с ASP .NET 2 на IIS7 и Vista - PullRequest
3 голосов
/ 01 декабря 2008

У меня есть сайт, работающий под ASP .NET 2 / IIS7 / Vista. У меня есть модуль перезаписи URL, который позволяет мне иметь URL без расширения. Чтобы заставить это работать, я настроил раздел system.webServer файла конфигурации так, чтобы все запросы пересылались в aspnet_isapi.dll. Я также добавил модуль перезаписи URL-адресов в раздел модулей и установил для runAllManagedModulesForAllRequests значение true.

Когда я запускаю веб-сайт и посещаю одну из страниц, где используется перезапись URL-адреса, страница отображается правильно. Однако, если я затем посещаю другую страницу, сайт перестает работать, и я получаю 404 не найден. Я также обнаружил, что моя точка останова в модуле перезаписи URL не получает удар. Похоже, что IIS перенаправляет первый запрос переписывающему устройству, но последующие отправляются куда-то еще - на странице ошибки упоминается Notification как MapRequestHandler, а Handler как StaticFile.

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

Для справки, вот пара фрагментов из файла конфигурации. Сначала под system.web:

<httpModules>
  <add name="UrlRewriteModule" type="Arcs.CoopFurniture.TelesalesWeb.UrlRewriteModule, Arcs.CoopFurniture.TelesalesWeb" />
</httpModules>

и затем в system.webServer:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="UrlRewriteModule" type="Arcs.CoopFurniture.TelesalesWeb.UrlRewriteModule, Arcs.CoopFurniture.TelesalesWeb" preCondition="managedHandler" />
  </modules>
  <handlers>
    <add name="AspNet" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
  </handlers>
  <validation validateIntegratedModeConfiguration="false" />
</system.web>

Сайт работает в классическом, а не в интегрированном режиме конвейера.

У кого-нибудь есть идеи? Я подозреваю, что моя конфигурация где-то неверна, но я не могу найти где.

Ответы [ 5 ]

0 голосов
/ 15 декабря 2008

Мне стыдно признаться в этом, но это была моя простая ошибка: - (

В моем модуле перезаписи URL-кода код для перезаписи пути запроса находился в методе Init, когда он должен был быть внутри обработчика Application.BeginRequest. Это объясняет, почему переписывание работало только при первом посещении сайта.

Извините, что потратил впустую ваше время, люди!

0 голосов
/ 01 декабря 2008
  1. Если вы работаете в классическом конвейерном режиме, вам не нужна секция <system.webServer>, она необходима для интегрированного режима
  2. Включить сопоставление сценариев с подстановочными знаками

    1. Откройте диспетчер IIS7 и перейдите на свой сайт

    2. Нажмите на сопоставления обработчиков

    3. На панели «Действие» нажмите «Добавить карту сценариев с подстановочными знаками»

    4. В диалоговом окне указать aspnet_isapi.dll

    5. Нажмите кнопку Да в окне сообщения, в котором вас просят подтвердить ваше сопоставление

    6. На панели действий нажмите «Просмотреть упорядоченный список» и переместите карту WildcardScriptMap непосредственно перед обработчиком StaticFile

Этого должно быть достаточно.

0 голосов
/ 01 декабря 2008

Вы также можете проверить новый модуль перезаписи IIS7. Вы можете прочитать об этом здесь http://learn.iis.net/page.aspx/460/using-url-rewrite-module/,, но, скорее всего, он будет более надежным, чем ваш собственный ISAPI-фильтр

0 голосов
/ 01 декабря 2008

Попробуйте http://www.codeplex.com/urlrewriter он поддерживает весь синтаксис Apache mod_rewrite, а также поддерживает обратный прокси.

0 голосов
/ 01 декабря 2008

Это немного похоже, но пытались ли вы на самом деле вносить изменения в конфигурацию IIS?

Я знаю, что путь web.config должен быть на 100% безошибочным, но я видел несколько вещей, которые помогают просто настроить его в IIS для правильной работы.

...