Разработка пользовательского поставщика переопределения для модуля переопределения URL-адресов
В этом пошаговом руководстве описано, как разработать поставщик перезаписи для модуля переопределения URL-адресов 2.0. Вы создадите ReplaceProvider, заменяющий все вхождения определенного символа в URL-адресе другим символом. Такого рода логику очень трудно и иногда невозможно выразить с точки зрения регулярных выражений, поэтому необходимо создать настраиваемый поставщик перезаписи.
Создание проекта Visual Studio
Чтобы создать проект Visual Studio для поставщика перезаписи, выполните следующие действия:
Откройте Microsoft Visual Studio 2008 или Microsoft Visual C# 2008 Express Edition.
В меню Файл выберите "Создать проект...".
В диалоговом окне "Новый проект" выберите шаблон проекта "Библиотека классов" и назовите проект ReplaceProvider.
Удалите файл Class1.cs, добавленный по умолчанию (так как вы не будете использовать этот файл), с помощью параметра контекстного меню Удалить в Обозреватель решений;
Выберите "Добавить ссылки..." в меню Проект и добавьте ссылки на Microsoft.Web.Iis.Rewrite.dll , расположенные в
%ProgramFiles%\Reference Assemblies\Microsoft\IIS
.Поставщики перезаписи должны быть помещены в глобальный кэш сборок .NET (GAC), чтобы быть видимыми для модуля переопределения URL-адресов. Для этого требуется, чтобы библиотека DLL сборки поставщика была строго именована (подписана). Чтобы подписать сборку, выберите параметр "Свойства ReplaceProvider..." в меню "Проект".
На вкладке Подписывание проверка поле проверка "Подписать сборку".
В поле со списком выберите параметр <Создать...> , чтобы создать новый ключ. В диалоговом окне "Создание ключа строгого имени" введите DemoKey.snk в качестве имени ключа и снимите флажок Защита файла ключа с помощью пароля проверка. Щелкните ОК.
Вкладка Подписывание должна выглядеть следующим образом:
Перейдите на вкладку "События сборки" и добавьте следующую командную строку "Событие после сборки":
CALL
%VS90COMNTOOLS%\vsvars32.bat
> NULL
gacutil.exe /if "$(TargetPath)"Примечание. Если вы используете Visual Studio 2010, замените %VS90COMNTOOLS% на %VS100COMNTOOLS%.
Реализация интерфейсов поставщика
Чтобы реализовать поставщик перезаписи, выполните следующие действия.
- В меню Проект выберите "Добавить класс..." и присвойте классу имя ReplaceProvider. В проект будет добавлен новый файл ReplaceProvider.cs .
- Измените код так, чтобы он выглядел следующим образом:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Iis.Rewrite;
public class ReplaceProvider: IRewriteProvider, IProviderDescriptor
{
char oldChar, newChar;
#region IRewriteProvider Members
public void Initialize(IDictionary<string, string> settings, IRewriteContext rewriteContext)
{
string oldCharString, newCharString;
if (!settings.TryGetValue("OldChar", out oldCharString) || string.IsNullOrEmpty(oldCharString))
throw new ArgumentException("OldChar provider setting is required and cannot be empty");
if (!settings.TryGetValue("NewChar", out newCharString) || string.IsNullOrEmpty(newCharString))
throw new ArgumentException("NewChar provider setting is required and cannot be empty");
if (!string.IsNullOrEmpty(oldCharString))
oldChar = oldCharString.Trim()[0];
else
throw new ArgumentException("OldChar parameter cannot be empty");
if (!string.IsNullOrEmpty(newCharString))
newChar = newCharString.Trim()[0];
else
throw new ArgumentException("NewChar parameter cannot be empty");
}
public string Rewrite(string value)
{
return value.Replace(oldChar, newChar);
}
#endregion
#region IProviderDescriptor Members
public IEnumerable<SettingDescriptor> GetSettings()
{
yield return new SettingDescriptor("OldChar", "Old Character");
yield return new SettingDescriptor("NewChar", "New Character");
}
#endregion
}
Приведенный выше код реализует два интерфейса:
IRewriteProvider — это интерфейс main, который необходимо реализовать. Он используется для инициализации поставщика путем передачи ему параметров конфигурации. Кроме того, он используется для выполнения поставщика.
IProviderDescriptor — это необязательный интерфейс, который можно использовать для информирования диспетчера IIS об именах и описаниях параметров конфигурации, используемых поставщиком.
Регистрация и настройка поставщика
После успешной сборки поставщика и его размещения в GAC необходимо зарегистрировать в модуле переопределения URL-адресов IIS. Чтобы зарегистрировать поставщика, выполните следующие действия.
- Откройте диспетчер IIS и выберите функцию переопределения URL-адресов.
- Щелкните "Просмотреть поставщиков..." Действий:
- На странице Поставщики щелкните Добавить поставщика... введите имя поставщика ReplaceProvider и выберите тип поставщика в раскрывающемся списке Управляемый тип: .
- Чтобы сохранить изменения, нажмите кнопку ОК.
- Теперь щелкните "Добавить параметр поставщика..." Действий. Обратите внимание, что в раскрывающемся списке "Name:" отображаются параметры, возвращенные методом IProviderDescriptor.GetSettings(). Выберите Старый символ и введите "_" в качестве значения.
- Нажмите кнопку ОК, чтобы сохранить параметр.
- Повторите шаги 5 и 6, но теперь выберите "Новый символ" и укажите "-" в качестве значения. Это означает, что поставщик будет использоваться для замены всех вхождений символа "_" символом "-" во входной строке.
На этом завершается регистрация и настройка поставщика перезаписи. В результате файл web.config для веб-сайта по умолчанию будет содержать следующий XML-код внутри <rewrite>
раздела:
<rewrite>
<providers>
<provider name="ReplaceProvider" type="ReplaceProvider, ReplaceProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=157df8edcf6cf889">
<settings>
<add key="OldChar" value="_" />
<add key="NewChar" value="-" />
</settings>
</provider>
</providers>
</rewrite>
Использование поставщика перезаписи
Теперь, когда поставщик перезаписи зарегистрирован, его можно использовать в правилах для входящего и исходящего трафика. Чтобы протестировать поставщика, создайте правило, которое перенаправляет все запросы для URL-адресов с символом "_" на URL-адрес, где этот символ заменяется на "-". Например, запрос на url-адрес, подобный этому http://localhost/some_blog_post/
, будет перенаправлен на http://localhost/some-blog-post/
.
Чтобы создать правило, использующее этот поставщик перезаписи, добавьте следующий XML-код в <rewrite>
элемент в файле web.config:
<rules>
<rule name="ReplaceProviderTest" stopProcessing="true">
<match url="_" />
<action type="Redirect" url="{ReplaceProvider:{URL}}" />
</rule>
</rules>
Откройте веб-браузер и сделайте запрос, чтобы http://localhost/some_blog_post/.
обратите внимание, что браузер был перенаправлен http://localhost/some-blog-post/
на сайт из-за добавленного правила. Веб-сервер вернет ошибку HTTP 404 для перенаправленного URL-адреса, так как на сервере нет такого файла или каталога, но это не относится к целям этого пошагового руководства. Важная часть заключается в том, что веб-сервер выдал ответ перенаправления на основе правила, которое использовало настраиваемый поставщик перезаписи.