Поделиться через


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

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

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

Общие сведения о шаблоне

Шаблон правила канонического доменного имени можно использовать для упрощения создания правила перезаписи, которое используется для применения канонического доменного имени для веб-сайта. Пользователи могут выбрать этот шаблон в диалоговом окне "Добавление правил":

Снимок экрана: диалоговое окно добавления правил с выбранным параметром

Затем пользователи могут указать доменное имя, которое они хотят использовать:

Снимок экрана:

После этого шаблон создаст правило перезаписи, как показано ниже:

Снимок экрана: область

Предварительные требования

Прежде чем продолжить работу с этим пошаговым руководством, рекомендуется ознакомиться с основными понятиями расширяемости диспетчера IIS, выполнив задачи, описанные в статье Создание простого модуля диспетчера IIS.

Проект VS2008 для шаблона правила

Полный проект Visual Studio 2008 для этого шаблона правила можно скачать здесь.

Реализация шаблона правила

Для поддержки удаленного управления все компоненты пользовательского интерфейса диспетчера IIS реализуются по определенному шаблону проектирования. Реализация модуля состоит из следующих частей:

  • Пользовательский интерфейс на стороне клиента и прокси-сервер службы
  • Серверная служба для управления конфигурацией IIS

Вся реализация пользовательского интерфейса находится на стороне клиента, который может быть удаленным клиентским компьютером. Все функции, которые фактически изменяют конфигурацию IIS, реализуются как служба на стороне сервера, обеспечивая таким образом доступ ко всем API конфигурации сервера. Клиентские элементы управления взаимодействуют со службой через прокси-сервер службы.

Рекомендуется реализовать шаблоны правил, следуя тому же шаблону, чтобы шаблоны работали, когда пользователи создают правила с помощью удаленного диспетчера IIS. В следующих разделах описывается, как реализовать службу шаблонов правил и клиент.

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

Создание модуля

Во-первых, необходимо создать модуль, main точку входа в клиенте для всех объектов расширяемости. Для этого выполните указанные далее действия.

  1. Создайте и настройте проект Visual Studio, выполнив действия, описанные в задачах 1 и 2 из статьи "Создание простого модуля диспетчера IIS". Присвойте проекту имя CanonicalDomainTemplateClient.
  2. Выберите Добавить ссылки в меню Проект и добавьте ссылки на Microsoft.Web.Management.dll, расположенные в папке \Windows\System32\inetsrv:
  3. Снова выберите Добавить ссылку и добавьте ссылку на Microsoft.Web.Management.Rewrite.Client.dll расположенную в папке \Program Files\Reference Assemblies\Microsoft\IIS.
  4. Снова выберите Добавить ссылку и добавьте ссылку на System.Windows.Forms.dll
  5. Выберите параметр Добавить новый элемент в меню Проект. В диалоговом окне Добавление нового элемента выберите шаблон Класс и введите CanonicalDomainModule.cs в качестве имени файла.
  6. Измените код так, чтобы он выглядел следующим образом:
using System;
using Microsoft.Web.Management.Server;
using Microsoft.Web.Management.Client;
using Microsoft.Web.Management.Iis.Rewrite;

namespace CanonicalDomainTemplate
{
    internal class CanonicalDomainModule: Module
    {
        protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
        {
            base.Initialize(serviceProvider, moduleInfo);

            IExtensibilityManager extensibilityManager = (IExtensibilityManager)GetService(typeof(IExtensibilityManager));

            extensibilityManager.RegisterExtension(typeof(RewriteTemplateFeature), new CanonicalDomainFeature(this)); 
        }
    }
}

Этот код инициализирует новый экземпляр класса CanonicalDomainFeature, который реализует функциональность шаблона правила. Экземпляр этого класса используется для регистрации расширения типа RewriteTemplateFeature, который является типом, от которого являются производными все шаблоны правил.

Создание функции переопределения шаблона

При определении класса, реализующего шаблон правила, необходимо наследовать этот класс от класса RewriteTemplateFeature . Это родительский класс, который используется всеми шаблонами правил переопределения URL-адресов.

  1. Выберите параметр Добавить новый элемент в меню Проект. Выберите шаблон Класс и введите CanonicalDomainFeature.cs в качестве имени файла.
  2. Измените код так, чтобы он выглядел следующим образом:
using System;
using Microsoft.Web.Management.Client;
using Microsoft.Web.Management.Iis.Rewrite;
using System.Windows.Forms;
using System.Collections;

namespace CanonicalDomainTemplate
{
    class CanonicalDomainFeature: RewriteTemplateFeature
    {
        private const string FeatureTitle = "Canonical Domain Name";
        private const string FeatureDescription = "Creates a rewrite rule for enforcing canonical domain name for your web site";

        public CanonicalDomainFeature(Module module)
            : base(module, FeatureTitle, FeatureDescription, Resource.domain_icon16, Resource.domain_icon32)
        {
        }

        public override void Run()
        {
            CanonicalDomainModuleServiceProxy serviceProxy = 
                 (CanonicalDomainModuleServiceProxy)Connection.CreateProxy(this.Module, 
                                                                           typeof(CanonicalDomainModuleServiceProxy));
            CanonicalDomainForm form = new CanonicalDomainForm(serviceProxy);
            form.StartPosition = FormStartPosition.CenterParent;
            if (form.ShowDialog() == DialogResult.OK)
            {
                Navigate(GetPageType("Rewrite"));
            }
        }

        /// <summary>
        /// Returns the main page for the specified module
        /// </summary>
        private Type GetPageType(string moduleName)
        {
            IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel));
            Module module = (Module)Connection.Modules[moduleName];

            if (module != null)
            {
                ICollection pageInfos = controlPanel.GetPages(module);

                foreach (ModulePageInfo pageInfo in pageInfos)
                {
                    if (pageInfo.IsEnabled && !pageInfo.PageType.IsAssignableFrom(typeof(IModuleChildPage)))
                    {
                        return pageInfo.PageType;
                    }
                }
            }

            return null;
        }
    }
}

Этот код делает следующее:

  1. Определяет имя и заголовок шаблона правила.
  2. Передает имя, заголовок и значки конструктору базового класса, чтобы они использовались при отображении всех зарегистрированных шаблонов правил.
  3. Определяет метод Run(), используемый для отрисовки пользовательского интерфейса шаблона, который является модальным диалоговым окном CanonicalDomainForm на основе WinForm. Если в диалоговом окне нажата кнопка ОК, то страница пользовательского интерфейса main модуля переопределения URL-адресов обновляется путем вызова метода Navigate().
  4. Наконец, он определяет вспомогающую функцию GetPageType, которая используется для получения страницы main для указанного модуля.

Определение прокси-сервера службы

Чтобы удаленный клиент вызывал службу, необходимо предоставить прокси-сервер службы. Для этого добавьте в проект еще один файл с именем CanonicalDomainModuleServiceProxy.cs и измените код в нем следующим образом:

using System;
using Microsoft.Web.Management.Client;
using Microsoft.Web.Management.Server;

namespace CanonicalDomainTemplate
{
    class CanonicalDomainModuleServiceProxy : ModuleServiceProxy
    {

        public void GenerateRule(string domainName)
        {
            Invoke("GenerateRule", domainName);
        }
    }
}

Фактическая реализация службы для метода GenerateRule будет добавлена позже.

Диалоговое окно реализации шаблона правила

Теперь, когда весь клиентский код диспетчера IIS завершен, осталось спроектировать и реализовать фактический пользовательский интерфейс для шаблона правила. Для этого выполните следующие действия.

  1. Выберите параметр Добавить новый элемент в меню проекта. В диалоговом окне Добавление нового элемента выберите "Форма Windows" и введите имя CanonicalDomainForm.cs:
    Снимок экрана: диалоговое окно добавления нового элемента с выбранным шаблоном Формы Windows Forms.

  2. Используйте конструктор Windows Forms в Visual Studio для размещения элементов управления в форме:
    Снимок экрана: новая форма в конструкторе форм Windows Visual Studio.

  3. Переключитесь в представление кода и добавьте закрытый член класса, который будет содержать ссылку на прокси-сервер службы:

    private CanonicalDomainModuleServiceProxy _serviceProxy;
    
  4. В том же классе измените код конструктора, как показано ниже:

    public CanonicalDomainForm(CanonicalDomainModuleServiceProxy serviceProxy)
    {
       _serviceProxy = serviceProxy;
       InitializeComponent();
    }
    
  5. В том же классе добавьте вспомогающую функцию, которая вызовет прокси-сервер службы для создания правила перезаписи с параметрами, заданными пользователем:

    private void GenerateRule(string domainName)
    {
        try
        {
            _serviceProxy.GenerateRule(domainName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    
  6. Добавьте обработчик событий при нажатии кнопки ОК. В коде обработчика событий вызовите вспомогательная функция GenerateRule, передав содержимое элемента управления TextBox в качестве параметра.

    private void OnOkButtonClick(object sender, EventArgs e)
    {
        GenerateRule(_DomainTextBox.Text);
    }
    

Реализация службы для шаблона правил

Чтобы реализовать службу, необходимо создать поставщик модулей, который является точкой входа для регистрации модулей в диспетчере IIS. Для этого выполните указанные далее действия.

  1. Создайте и настройте другой проект Visual Studio, выполнив действия, описанные в задачах 1 и 2 из статьи "Создание простого модуля диспетчера IIS". Присвойте проекту имя CanonicalDomainTemplate.

  2. Выберите Добавить ссылки в меню Проект и добавьте ссылки на следующие сборки, расположенные в \Windows\System32\inetsrv:

    1. Microsoft.Web.Administration.dll
    2. Microsoft.Web.Management.dll
  3. Выберите параметр Добавить новый элемент в меню Проект. В диалоговом окне Добавление нового элемента выберите шаблон Класс и введите CanonicalDomainModuleProvider.cs в качестве имени файла.

  4. Измените код так, чтобы он выглядел, как показано ниже (не забудьте заменить PublicKeyToken маркером открытого ключа сборки CanonicalDomainTemplate.Client.dll).

namespace CanonicalDomainTemplate
{
    internal sealed class CanonicalDomainModuleProvider : ModuleProvider
    {
        public override string FriendlyName
        {
            get
            {
                return Resource.ModuleFriendlyName;
            }
        }

        public override Type ServiceType
        {
            get {
                 return typeof(CanonicalDomainModuleService);
            }
        }

        public override ModuleDefinition GetModuleDefinition(IManagementContext context)
        {
            if (context != null && string.Compare(context.ClientUserInterfaceTechnology, 
            "System.Windows.Forms.Control", StringComparison.OrdinalIgnoreCase) != 0)
            {
                return null;
            }

            return new ModuleDefinition(Name, "CanonicalDomainTemplate.CanonicalDomainModule,
                                               CanonicalDomainTemplate.Client,Version=1.0.0.0,Culture=neutral,
                                               PublicKeyToken={your key}");
        }

        public override bool SupportsScope(ManagementScope scope)
        {
            return true;
        }
    }
}

Этот код создает ModuleProvider, который поддерживает все типы подключений (сервер, сайт и приложение), и регистрирует клиентский модуль CanonicalDomainModule. Кроме того, он регистрирует тип службы модуля CanonicalDomainModuleService , который используется на стороне сервера для создания правил перезаписи.

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

  1. Выберите параметр Добавить новый элемент в меню Проект. Выберите шаблон Класс и введите CanonicalDomainModuleService.cs в качестве имени файла.
  2. Измените код так, чтобы он выглядел следующим образом:
using System;
using System.Collections.Generic;
using Microsoft.Web.Management.Server;
using Microsoft.Web.Administration;

namespace CanonicalDomainTemplate
{
    class CanonicalDomainModuleService : ModuleService
    {

        [ModuleServiceMethod]
        public void GenerateRule(string domainName)
        {
            string sectionPath = "system.webServer/rewrite/rules";
            
            if (ManagementUnit.ConfigurationPath.PathType == ConfigurationPathType.Server)
            {
                sectionPath = "system.webServer/rewrite/globalRules";
            }

            ConfigurationSection rulesSection = ManagementUnit.Configuration.GetSection(sectionPath);
            ConfigurationElementCollection rulesCollection = rulesSection.GetCollection();

            ConfigurationElement ruleElement = rulesCollection.CreateElement("rule");
            ruleElement["name"] = @"Canonical domain for " + domainName;
            ruleElement["patternSyntax"] = @"Wildcard";
            ruleElement["stopProcessing"] = true;

            ConfigurationElement matchElement = ruleElement.GetChildElement("match");
            matchElement["url"] = @"*";

            ConfigurationElement conditionsElement = ruleElement.GetChildElement("conditions");

            ConfigurationElementCollection conditionsCollection = conditionsElement.GetCollection();

            ConfigurationElement addElement = conditionsCollection.CreateElement("add");
            addElement["input"] = @"{HTTP_HOST}";
            addElement["negate"] = true;
            addElement["pattern"] = domainName;
            conditionsCollection.Add(addElement);

            ConfigurationElement actionElement = ruleElement.GetChildElement("action");
            actionElement["type"] = @"Redirect";
            actionElement["url"] = @"http://" + domainName + @"/{R:1}";
            actionElement["appendQueryString"] = true;
            rulesCollection.Add(ruleElement);

            ManagementUnit.Update();
        }
    }
}

Этот код создает правило для перенаправления в канонический домен.

Совет

Чтобы быстро получить код для создания правил перезаписи, используйте редактор конфигурации для IIS 7.0 и более поздних версий, который входит в пакет администрирования для IIS. Дополнительные сведения о создании кода для создания правил перезаписи см. в этой статье .

Регистрация шаблона правила в диспетчере IIS

После успешной компиляции проекта шаблона правил и его размещения в глобальном кэше сборок необходимо зарегистрировать в диспетчере IIS, добавив сведения в файл administration.config.

Откройте administration.config файл, расположенный в папке \Windows\System32\inetsrv\config, и добавьте следующую строку в <раздел moduleProviders> . Обязательно замените PublicKeyToken:

<add name="CanonicalDomainName" type="CanonicalDomainTemplate.CanonicalDomainModuleProvider, CanonicalDomainTemplate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e4e6d0bc8fe7a06a" />

Примечание

Добавляя его только в список moduleProviders, вы регистрируете модуль только для подключений к серверу. Если вы хотите, чтобы этот модуль был включен для подключений сайта и приложений, добавьте его в следующий список:

<location path=".">
   <module> 
     <add name="CanonicalDomainName" />
   </module>
</location>

После выполнения этих действий вы увидите шаблон правила "Каноническое доменное имя" в диалоговом окне Добавление правил модуля Переопределение URL-адресов.