Зависит от того, используете ли вы IIS7 Classic или Integrated Pipeline Mode.Стандартный способ сделать это в режиме Integrated Pipeline заключается в следующем:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</modules>
</system.webServer>
Но для безопасности вы, вероятно, захотите поддерживать комбинацию IIS7 Classic / Integrated с постепенным ухудшением IIS5 / 6 (в случае, если ваш*) (dev box использует другую ОС), Рик Страхал рекомендует использовать следующий код в веб-конфигурации для поддержки обоих и обхода неприятной ошибки, выдаваемой IIS, если вы сделаете ее обратно совместимой:
<system.web>
<httpModules>
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</modules>
</system.webServer>
Вы также заметите добавление runAllManagedModulesForAllRequest = "true", это актуально, так как в противном случае код в вашем HttpModule будет выполняться только тогда, когда браузер вызывает файлы .aspx, .ashx, .asmx и т. Д., Которыми управляет.NET Framework.
Кроме того, чтобы фактически переписать URL-адрес (вместо перенаправления пользователя), вам нужно будет использовать метод context.RewritePath(string)
внутри вашего обработчика событий.
Способэто работает так, что application.Request.Path
поставляется с «дружественной» строкой, которая, как мне кажется, выглядит в вашем приложении следующим образом:
http://www.domain.com/robertp
Что переписывается следующим образом:
http://www.domain.com/Profiles/profile.aspx?AccountID=59
Для этого вместо использования context.Response.Redirect()
вам нужно будет использовать context.RewritePath()
следующим образом:
string UserURL = "~/Profiles/profile.aspx?AccountID=" + account.AccountID.ToString();
context.RewritePath(UserURL);
... TADA !!
Это должно гарантировать, что URL-адрес, передаваемый на сервер, будет с profiles.aspx?AccountID=59
, пока пользователь получаетболее дружественный robertp
в их браузере.
Что касается параметров конфигурации, то, пока вы придерживаетесь IIS7, у вас все будет в порядке с настройками веб-конфигурации выше.Когда вы пытаетесь протестировать на своем Dev-компьютере под управлением IIS6 или IIS5, у вас может быть проблема, и это обычно связано с тем, что robertp
не имеет распознаваемого расширения файла, поэтому ваш код HttpModule не будет выполняться, пока вы не добавитерасширение файла, использующее .NET ISAPI.
Надеюсь, это было полезно.