開發適用于 URL 重寫模組的自訂重寫提供者
作者: Ruslan Yakushev
本逐步解說將引導您開發 URL 重寫模組 2.0 的重寫提供者。 您將建立 ReplaceProvider,以另一個字元取代 URL 中所有出現的特定字元。 這種邏輯在正則運算式方面非常困難且有時不可能表達,因此需要建立自訂重寫提供者。
建立 Visual Studio 專案
若要建立重寫提供者的 Visual Studio 專案,請遵循下列步驟:
開啟 Microsoft Visual Studio 2008 或 Microsoft Visual C# 2008 Express Edition。
在 [檔案] 功能表中,選取 [新增專案...]。
移除預設 (新增的Class1.cs檔案,因為您不會使用該檔案) 使用方案總管中的操作功能表[刪除] 選項;
選取 [新增參考...]從 [專案] 功能表,並將參考 新增至 位於 Microsoft.Web.Iis.Rewrite.dll
%ProgramFiles%\Reference Assemblies\Microsoft\IIS
。重寫提供者必須放在 .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,然後從 [Managed Type:] 下拉式清單中選擇提供者類型。
- 按一下 [確定] 儲存變更。
- 現在按一下 [新增提供者設定...]行動。 請注意,[名稱:] 下拉式清單會顯示 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>
開啟網頁瀏覽器並提出要求 http://localhost/some_blog_post/.
,通知瀏覽器因為您已新增的規則而重新導向至 http://localhost/some-blog-post/
。 網頁伺服器會傳回重新導向 URL 的 HTTP 404 錯誤,因為伺服器上沒有這類檔案或目錄,但這與本逐步解說的目的無關。 重點是網頁伺服器會根據使用自訂重寫提供者的規則發出重新導向回應。