Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве описано, как разработать шаблон правила для модуля перезаписи URL-адресов. Вы создадите шаблон правила, который можно использовать для создания правила перезаписи, которое применяет использование определенного домена для веб-сайта.
Общие сведения о шаблоне
Шаблон правила канонического доменного имени можно использовать для упрощения создания правила переопределения, которое используется для принудительного применения канонического доменного имени для веб-сайта. Пользователи могут выбрать этот шаблон в диалоговом окне "Добавить правила":
Затем пользователи могут указать доменное имя, которое они хотят использовать:
После этого шаблон создаст правило перезаписи, как показано ниже:
Необходимые условия
Прежде чем продолжить работу с этим пошаговом руководстве, рекомендуется ознакомиться с основными понятиями расширяемости диспетчера IIS, выполнив задачи в статье "Создание простого модуля диспетчера IIS".
Проект VS2008 для шаблона правила
Полный проект Visual Studio 2008 для этого шаблона правила доступен для скачивания здесь.
Реализация шаблона правила
Для поддержки удаленного управления все компоненты пользовательского интерфейса IIS Manager реализуются с помощью определенного шаблона проектирования. Реализация модуля состоит из следующих частей:
- Клиентский пользовательский интерфейс и прокси-сервер службы
- Серверная служба для управления конфигурацией IIS
Все реализации пользовательского интерфейса находятся на стороне клиента, которая может быть удаленным клиентским компьютером. Все функциональные возможности, которые фактически изменяют конфигурацию IIS, реализованы как услуга на стороне сервера, что гарантирует, что он имеет доступ ко всем API конфигурации сервера. Клиентские элементы управления взаимодействуют со службой через прокси-сервер службы.
Рекомендуется реализовать шаблоны правил, следуя тому же шаблону, чтобы шаблоны работали при создании правил с помощью удаленного диспетчера IIS. В следующих разделах описывается реализация службы шаблонов правил и клиента.
Реализация клиентского пользовательского интерфейса
Создание модуля
Во-первых, необходимо создать модуль, это основная точка входа в клиенте для всех объектов расширяемости. Для этого выполните указанные далее действия.
- Создайте и настройте проект Visual Studio, выполнив действия, описанные в задачах 1 и 2 из статьи "Создание простого модуля диспетчера IIS". Присвойте проекту имя "CanonicalDomainTemplateClient".
- Выберите "Добавить ссылки " в меню "Проект " и добавьте ссылки на Microsoft.Web.Management.dll, расположенные в папке \Windows\System32\inetsrv:
- Нажмите кнопку "Добавить ссылку" еще раз и добавьте ссылку на Microsoft.Web.Management.Rewrite.Client.dll, расположенную в папке \Program Files\Reference Assemblies\Microsoft\IIS.
- Нажмите кнопку "Добавить ссылку " еще раз и добавьте ссылку на System.Windows.Forms.dll
- Выберите параметр "Добавить новый элемент" в меню "Проект". В диалоговом окне "Добавить новый элемент" выберите шаблон класса и введите CanonicalDomainModule.cs в качестве имени файла.
- Измените код таким образом, чтобы он выглядел следующим образом:
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-адресов.
- Выберите параметр "Добавить новый элемент" в меню "Проект". Выберите шаблон класса и введите CanonicalDomainFeature.cs в качестве имени файла.
- Измените код таким образом, чтобы он выглядел следующим образом:
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;
}
}
}
Этот код выполняет следующие действия:
- Определяет имя и заголовок шаблона правила
- Передает имя, заголовок и значки конструктору базового класса, чтобы они использовались, когда диалоговое окно «Добавить правило(а)» отображает все зарегистрированные шаблоны правил.
- Определяет метод Run(), используемый для отрисовки пользовательского интерфейса шаблона, который является модальным диалоговым окном на основе WinForm CanonicalDomainForm. Если кнопка "ОК" нажимается в диалоговом окне, то основная страница пользовательского интерфейса модуля перезаписи URL-адресов обновляется путем вызова метода Navigate().
- Наконец, он определяет вспомогательной функции GetPageType , которая используется для получения главной страницы для указанного модуля.
Определение прокси службы
Для удаленного клиента для вызова службы необходимо предоставить прокси-сервер службы. Для этого добавьте в проект еще один файл с именем 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 завершен, оставшаяся часть заключается в проектировании и реализации пользовательского интерфейса для шаблона правила. Для этого выполните следующие действия.
Выберите параметр Добавить новый элемент в меню проекта. В диалоговом окне "Добавить новый элемент" выберите "Форма Windows" и введите имя CanonicalDomainForm.cs.
Используйте конструктор windows Forms Visual Studio для упорядочивания элементов управления в форме:
Перейдите в представление кода и добавьте закрытый член класса, который будет содержать ссылку на прокси-сервер службы:
private CanonicalDomainModuleServiceProxy _serviceProxy;В том же классе измените код конструктора, как показано ниже:
public CanonicalDomainForm(CanonicalDomainModuleServiceProxy serviceProxy) { _serviceProxy = serviceProxy; InitializeComponent(); }В том же классе добавьте вспомогающую функцию, которая вызовет прокси-сервер службы для создания правила перезаписи с параметрами, указанными пользователем:
private void GenerateRule(string domainName) { try { _serviceProxy.GenerateRule(domainName); } catch (Exception ex) { MessageBox.Show(ex.Message); } }Добавьте обработчик событий при нажатии кнопки "ОК". В коде обработчика событий вызывайте вспомогательную функцию GenerateRule, передав содержимое элемента управления TextBox в качестве параметра.
private void OnOkButtonClick(object sender, EventArgs e) { GenerateRule(_DomainTextBox.Text); }
Реализация сервиса для шаблона правил
Чтобы реализовать службу, необходимо создать поставщика модулей, который является точкой входа для регистрации модулей в диспетчере IIS. Для этого выполните указанные далее действия.
Создайте и настройте другой проект Visual Studio, выполнив действия, описанные в задачах 1 и 2 из статьи "Создание простого модуля диспетчера IIS". Присвойте проекту имя "CanonicalDomainTemplate".
Выберите "Добавить ссылки " в меню "Проект " и добавьте ссылки на следующие сборки, расположенные в папке \Windows\System32\inetsrv:
- Microsoft.Web.Administration.dll
- Microsoft.Web.Management.dll
Выберите параметр "Добавить новый элемент" в меню "Проект". В диалоговом окне "Добавление нового элемента" выберите шаблон класса и введите CanonicalDomainModuleProvider.cs в качестве имени файла.
Измените код так, чтобы он выглядел, как показано ниже (не забудьте заменить 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 , которая используется на стороне сервера для создания правил перезаписи.
Чтобы создать службу для шаблона правила, выполните следующие действия.
- Выберите параметр "Добавить новый элемент" в меню "Проект". Выберите шаблон класса и введите CanonicalDomainModuleService.cs в качестве имени файла.
- Измените код таким образом, чтобы он выглядел следующим образом:
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" />
Замечание
Добавив его только в список поставщиков модулей, вы регистрируете модуль только для серверных подключений. Если вы хотите включить этот модуль для подключений сайта, а также подключений приложений, добавьте его в следующий список:
<location path=".">
<module>
<add name="CanonicalDomainName" />
</module>
</location>
После выполнения этих действий вы сможете просмотреть шаблон правила "Каноническое доменное имя" в диалоговом окне добавления правил модуля переопределения URL-адресов.