Разработка пользовательского поставщика переопределения для модуля переопределения URL-адресов

Руслан Якушев

В этом пошаговом руководстве описано, как разработать поставщик перезаписи для модуля переопределения URL-адресов 2.0. Вы создадите ReplaceProvider, заменяющий все вхождения определенного символа в URL-адресе другим символом. Такого рода логику очень трудно и иногда невозможно выразить с точки зрения регулярных выражений, поэтому необходимо создать настраиваемый поставщик перезаписи.

Создание проекта Visual Studio

Чтобы создать проект Visual Studio для поставщика перезаписи, выполните следующие действия:

  1. Откройте Microsoft Visual Studio 2008 или Microsoft Visual C# 2008 Express Edition.

  2. В меню Файл выберите "Создать проект...".

  3. В диалоговом окне "Новый проект" выберите шаблон проекта "Библиотека классов" и назовите проект ReplaceProvider.
    Снимок экрана: диалоговое окно

  4. Удалите файл Class1.cs, добавленный по умолчанию (так как вы не будете использовать этот файл), с помощью параметра контекстного меню Удалить в Обозреватель решений;

  5. Выберите "Добавить ссылки..." в меню Проект и добавьте ссылки на Microsoft.Web.Iis.Rewrite.dll , расположенные в %ProgramFiles%\Reference Assemblies\Microsoft\IIS.

  6. Поставщики перезаписи должны быть помещены в глобальный кэш сборок .NET (GAC), чтобы быть видимыми для модуля переопределения URL-адресов. Для этого требуется, чтобы библиотека DLL сборки поставщика была строго именована (подписана). Чтобы подписать сборку, выберите параметр "Свойства ReplaceProvider..." в меню "Проект".

  7. На вкладке Подписывание проверка поле проверка "Подписать сборку".

  8. В поле со списком выберите параметр <Создать...> , чтобы создать новый ключ. В диалоговом окне "Создание ключа строгого имени" введите DemoKey.snk в качестве имени ключа и снимите флажок Защита файла ключа с помощью пароля проверка. Щелкните ОК.
    Снимок экрана: диалоговое окно
    Вкладка Подписывание должна выглядеть следующим образом:
    Снимок экрана: вкладка подписывания с введенным именем файла ключа в поле Выбор файла ключа строгого имени.

  9. Перейдите на вкладку "События сборки" и добавьте следующую командную строку "Событие после сборки":

    CALL %VS90COMNTOOLS%\vsvars32.bat> NULL
    gacutil.exe /if "$(TargetPath)"

    Примечание. Если вы используете Visual Studio 2010, замените %VS90COMNTOOLS% на %VS100COMNTOOLS%.

Реализация интерфейсов поставщика

Чтобы реализовать поставщик перезаписи, выполните следующие действия.

  1. В меню Проект выберите "Добавить класс..." и присвойте классу имя ReplaceProvider. В проект будет добавлен новый файл ReplaceProvider.cs .
  2. Измените код так, чтобы он выглядел следующим образом:
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. Чтобы зарегистрировать поставщика, выполните следующие действия.

  1. Откройте диспетчер IIS и выберите функцию переопределения URL-адресов.
  2. Щелкните "Просмотреть поставщиков..." Действий:
    Снимок экрана: диспетчер I I S Manager с фокусом на параметре
  3. На странице Поставщики щелкните Добавить поставщика... введите имя поставщика ReplaceProvider и выберите тип поставщика в раскрывающемся списке Управляемый тип: .
    Снимок экрана: параметр
  4. Чтобы сохранить изменения, нажмите кнопку ОК.
  5. Теперь щелкните "Добавить параметр поставщика..." Действий. Обратите внимание, что в раскрывающемся списке "Name:" отображаются параметры, возвращенные методом IProviderDescriptor.GetSettings(). Выберите Старый символ и введите "_" в качестве значения.
    Снимок экрана: экран
  6. Нажмите кнопку ОК, чтобы сохранить параметр.
  7. Повторите шаги 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-адреса, так как на сервере нет такого файла или каталога, но это не относится к целям этого пошагового руководства. Важная часть заключается в том, что веб-сервер выдал ответ перенаправления на основе правила, которое использовало настраиваемый поставщик перезаписи.