次の方法で共有


URL Rewrite Module 用のカスタム書き換えプロバイダーの開発

著者 Ruslan Yakushev

このチュートリアルでは、URL Rewrite Module 2.0 の書き換えプロバイダーを開発する方法について説明します。 URL 内の特定の文字のすべての出現箇所を別の文字に置き換える ReplaceProvider を作成します。 この種のロジックは本当に難しく、正規表現の観点からは表現できない場合があるため、カスタム書き換えプロバイダーを作成する必要があります。

Visual Studio プロジェクト の作成

書き換えプロバイダー用の Visual Studio プロジェクトを作成するには、次の手順に従います:

  1. Microsoft Visual Studio 2008 または Microsoft Visual C# 2008 Express Edition を開きます。

  2. [ファイル] メニューで "新規プロジェクト..." を選択します。

  3. "新しいプロジェクト" ダイアログで、"クラス ライブラリ" プロジェクト テンプレートを選択し、プロジェクトに ReplaceProvider という名前を付けます。
    [クラス ライブラリ プロジェクト テンプレート] オプションが強調表示されている [新しいプロジェクト] ダイアログのスクリーンショット。

  4. ソリューション エクスプローラーのコンテキスト メニュー の [削除] オプションを使用して、既定で追加される Class1.cs ファイルを削除します (そのファイルを使用しないため) ;

  5. [プロジェクト] メニューから [参照の追加..] を選択し、%ProgramFiles%\Reference Assemblies\Microsoft\IISにある Microsoft.Web.Iis.Rewrite.dll への参照を追加します。

  6. URL Rewrite Module で表示するには、書き換えプロバイダーを .NET グローバル アセンブリ キャッシュ (GAC) に配置する必要があります。 そのためには、プロバイダー アセンブリ DLL に厳密な名前を付ける (署名済み) 必要があります。 アセンブリに署名するには、"プロジェクト" メニューから "ReplaceProvider Properties..." オプションを選択します。

  7. [署名] タブで、"アセンブリに署名する" チェック ボックスをオンにします。

  8. コンボ ボックスで、<新規...> オプションを選択して新しいキーを作成します。 "厳密な名前キーの作成" ダイアログで、キーの名前として DemoKey.snk を入力し、[パスワードでキー ファイルを保護する] チェック ボックスをオフにします。 OK をクリックします。
    [キー ファイル名]、[パスワードの入力]、[パスワードの確認] フィールドが含まれている [厳密な名前キーの作成] ダイアログのスクリーンショット。
    [署名] タブは次のようになります:
    [Choose a strong name key file]\(厳密な名前のキー ファイルの選択\) フィールドに入力されたキー ファイル名を示す [署名] タブのスクリーンショット。

  9. [ビルド イベント] タブを選択し、次の "ビルド後のイベント" コマンド ラインを追加します:

    CALL %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
}

上記のコードでは、次の 2 つのインターフェイスが実装されています:

IRewriteProvider - これは実装する必要があるメイン インターフェイスです。 プロバイダーの構成設定に渡すことによって、プロバイダーを初期化するために使用されます。 また、プロバイダーの実行にも使用されます。

IProviderDescriptor - これは省略可能なインターフェイスであり、プロバイダーによって使用される構成設定の名前と説明について IIS マネージャーに通知するために使用できます。

プロバイダーの登録と構成

プロバイダーが正常にビルドされて GAC に配置されたら、IIS URL Rewrite Module に登録する必要があります。 プロバイダーを登録するには:

  1. IIS マネージャーを開き、URL Rewrite 機能を選択する
  2. "プロバイダーの表示..." アクションをクリックします:
    [操作] ウィンドウの [プロバイダーの管理] セクションの [プロバイダーの表示] オプションに重点を置いた I I S マネージャーのスクリーンショット。
  3. [プロバイダー] ページで [プロバイダーの追加... ]アクション をクリックし、プロバイダー名を ReplaceProvider として入力して、[マネージド型:] ドロップダウン リストからプロバイダーの種類を選択します。
    [操作] ウィンドウの [プロバイダーの表示] オプションのスクリーンショット。
  4. [OK] をクリックして変更を保存します。
  5. "プロバイダー設定の追加..." アクションをクリックします。 "Name:" ドロップダウン リストには、IProviderDescriptor.GetSettings() メソッドによって返された設定が表示されます。 古い文字の設定を選択し、値として "_" と入力します。
    I I S マネージャー画面の [書き換えプロバイダー] セクション内の [プロバイダー設定の編集] 画面のスクリーンショット。
  6. [OK] をクリックして設定を保存します
  7. 手順 5 と 6 を繰り返しますが、[新しい文字] を選択し、値として "-" を指定します。 つまり、プロバイダーは、入力文字列内で発生するすべての "_" 文字を "-" 文字に置き換えるために使用されます。

これにより、書き換えプロバイダーの登録と構成が完了します。 その結果、既定の Web サイトの 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 サーバーがカスタム書き換えプロバイダーを使用する規則に基づいてリダイレクト応答を発行したということです。