为 URL 重写模块开发自定义重写提供程序

作者:Ruslan Yakushev

本演练将指导你开发 URL 重写模块 2.0 的重写提供程序。 你将创建一个 ReplaceProvider,将 URL 中特定字符的所有匹配项替换为另一个字符。 此类逻辑非常困难,有时无法在正则表达式中表达,因此需要创建自定义重写提供程序。

创建 Visual Studio 项目

若要为重写提供程序创建 Visual Studio 项目,请执行以下步骤:

  1. 打开 Microsoft Visual Studio 2008 或 Microsoft Visual Web Developer 2008 Express Edition。

  2. 在“文件”菜单上,选择“新建项目”。

  3. 在“新建项目”对话框中,选择“类库”项目模板,并命名项目为 ReplaceProvider
    Screenshot of the New Project dialog with Class Library project template option being highlighted.

  4. 使用解决方案资源管理器中的上下文菜单“删除”选项,删除默认添加的文件 Class1.cs(因为你不会使用该文件);

  5. 从“项目”菜单选择“添加引用”,添加对位于 %ProgramFiles%\Reference Assemblies\Microsoft\IIS 的 Microsoft.Web.Iis.Rewrite.dll 引用。

  6. 重写提供程序必须放置在 .NET 全局程序集缓存 (GAC) 中才能对 URL 重写模块可见。 这要求提供程序程序集 DLL 具有强名称(已签名)。 若要对程序集进行签名,请从“项目”菜单选择“ReplaceProvider 属性”选项。

  7. 在“签名”选项卡上,选中“为程序集签名”复选框。

  8. 在组合框中,选择“新建”选项<>以创建新密钥。 在“创建强名称密钥”对话框中,输入 DemoKey.snk 作为密钥名称,并取消选中“使用密码保护我的密钥文件”复选框。 单击“确定”。
    Screenshot of the Create Strong Name Key dialog, which contains the Key file name, Enter password, and Confirm password fields.
    “签名”选项卡应如下所示:
    Screenshot of the signing tab showing the entered key file name in the Choose a strong name key file field.

  9. 选择“生成事件”选项卡,并添加以下“生成后事件”命令行:

    调用 %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 - 这是必须实现的主接口。 它用于通过传递给配置设置来初始化提供程序。 它还用于执行提供程序。

IProviderDescriptor - 这是一个可选接口,可用于告知 IIS 管理器提供程序所使用的配置设置的名称和说明。

注册和配置提供程序

成功生成提供程序并将其放入 GAC 后,需要向 IIS URL 重写模块注册该提供程序。 若要注册提供程序:

  1. 打开 IIS 管理器,并选择 URL 重写功能
  2. 单击“查看提供程序”行动:
    Screenshot of the I I S Manager with a focus on the View Providers option in the Manage Providers section of the Actions pane.
  3. 在“提供程序”页,单击“添加提供程序”操作,然后输入提供程序名称为 ReplaceProvider,然后从“托管类型”下拉列表中选择提供程序类型。
    Screenshot of the View Providers option in the Actions pane.
  4. 单击“确定”以保存更改 。
  5. 现在单击“添加提供程序设置”行动。 请注意,“名称”下拉列表显示 IProviderDescriptor.GetSettings() 方法返回的设置。 选择“旧字符”设置,并输入“_”作为值。
    Screenshot of the Edit Provider Setting screen within the Rewrite Providers section of the I I S Manager screen.
  6. 单击“确定”保存设置
  7. 重复步骤 5 和 6,但现在选择“新建字符”,并将“-”指定为值。 这意味着提供程序将用于将输入字符串中“_”字符的所有匹配项替换为“-”字符。

这将完成重写提供程序的注册和配置。 因此,默认网站的 web.config 文件将包含 <rewrite> 部分的以下 XML 代码:

<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。 例如,对类似 http://localhost/some_blog_post/ URL 的请求将重定向到 http://localhost/some-blog-post/

若要创建使用此重写提供程序的规则,请在 web.config 文件中的 <rewrite> 元素中添加以下 XML 代码:

<rules>
    <rule name="ReplaceProviderTest" stopProcessing="true">
        <match url="_" />
        <action type="Redirect" url="{ReplaceProvider:{URL}}" />
    </rule>
</rules>

打开 Web 浏览器并向 http://localhost/some_blog_post/. 发出请求,请注意,因为已添加的规则,浏览器已重定向到 http://localhost/some-blog-post/。 Web 服务器将返回重定向 URL 的 HTTP 404 错误,因为服务器上没有此类文件或目录,但这与本演练的目的无关。 重要的是,Web 服务器根据使用自定义重写提供程序的规则发出了重定向响应。