为 URL 重写模块开发自定义重写提供程序
本演练将指导你开发 URL 重写模块 2.0 的重写提供程序。 你将创建一个 ReplaceProvider,将 URL 中特定字符的所有匹配项替换为另一个字符。 此类逻辑非常困难,有时无法在正则表达式中表达,因此需要创建自定义重写提供程序。
创建 Visual Studio 项目
若要为重写提供程序创建 Visual Studio 项目,请执行以下步骤:
打开 Microsoft Visual Studio 2008 或 Microsoft Visual Web Developer 2008 Express Edition。
在“文件”菜单上,选择“新建项目”。
使用解决方案资源管理器中的上下文菜单“删除”选项,删除默认添加的文件 Class1.cs(因为你不会使用该文件);
从“项目”菜单选择“添加引用”,添加对位于
%ProgramFiles%\Reference Assemblies\Microsoft\IIS
的 Microsoft.Web.Iis.Rewrite.dll 引用。重写提供程序必须放置在 .NET 全局程序集缓存 (GAC) 中才能对 URL 重写模块可见。 这要求提供程序程序集 DLL 具有强名称(已签名)。 若要对程序集进行签名,请从“项目”菜单选择“ReplaceProvider 属性”选项。
在“签名”选项卡上,选中“为程序集签名”复选框。
在组合框中,选择“新建”选项<>以创建新密钥。 在“创建强名称密钥”对话框中,输入 DemoKey.snk 作为密钥名称,并取消选中“使用密码保护我的密钥文件”复选框。 单击“确定”。
“签名”选项卡应如下所示:
选择“生成事件”选项卡,并添加以下“生成后事件”命令行:
调用
%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 - 这是必须实现的主接口。 它用于通过传递给配置设置来初始化提供程序。 它还用于执行提供程序。
IProviderDescriptor - 这是一个可选接口,可用于告知 IIS 管理器提供程序所使用的配置设置的名称和说明。
注册和配置提供程序
成功生成提供程序并将其放入 GAC 后,需要向 IIS URL 重写模块注册该提供程序。 若要注册提供程序:
- 打开 IIS 管理器,并选择 URL 重写功能
- 单击“查看提供程序”行动:
- 在“提供程序”页,单击“添加提供程序”操作,然后输入提供程序名称为 ReplaceProvider,然后从“托管类型”下拉列表中选择提供程序类型。
- 单击“确定”以保存更改 。
- 现在单击“添加提供程序设置”行动。 请注意,“名称”下拉列表显示 IProviderDescriptor.GetSettings() 方法返回的设置。 选择“旧字符”设置,并输入“_”作为值。
- 单击“确定”保存设置
- 重复步骤 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 服务器根据使用自定义重写提供程序的规则发出了重定向响应。