Freigeben über


Entwickeln eines benutzerdefinierten Rewrite-Anbieters für das URL-Rewrite-Modul

von Ruslan Yakushev

In dieser exemplarischen Vorgehensweise erfahren Sie, wie Sie einen Rewrite-Anbieter für das URL-Rewrite-Modul 2.0 entwickeln. Sie werden einen ReplaceProvider erstellen, der alle Vorkommen eines bestimmten Zeichens in der URL durch ein anderes Zeichen ersetzt. Diese Art von Logik lässt sich nur schwer und manchmal gar nicht mit regulären Ausdrücken realisieren. Daher ist es notwendig, einen benutzerdefinierten Rewrite-Anbieter zu erstellen.

Erstellen eines Visual Studio-Projekts

Führen Sie die folgenden Schritte aus, um ein Visual Studio-Projekt für einen Rewrite-Anbieter zu erstellen:

  1. Öffnen Sie Microsoft Visual Studio 2008 oder Microsoft Visual C# 2008 Express Edition.

  2. Wählen Sie im Menü „Datei“ die Option „Neues Projekt...“ aus.

  3. Wählen Sie im Dialogfeld „Neues Projekt“ die Projektvorlage „Klassenbibliothek“ aus, und nennen Sie das Projekt ReplaceProvider.
    Screenshot of the New Project dialog with Class Library project template option being highlighted.

  4. Entfernen Sie die Datei Class1.cs, die standardmäßig hinzugefügt wird (da Sie diese Datei nicht verwenden werden), indem Sie im Projektmappen-Explorer im Kontextmenü die Option Löschen verwenden.

  5. Wählen Sie „Verweise hinzufügen...“ aus dem „Projekt“-Menü und fügen Sie Verweise zu Microsoft.Web.Iis.Rewrite.dll in %ProgramFiles%\Reference Assemblies\Microsoft\IIS hinzu.

  6. Rewrite-Anbieter müssen im .NET Global Assembly Cache (GAC) platziert werden, damit sie für das URL-Rewrite-Modul sichtbar sind. Dazu muss die Anbieterassembly-DLL einen starken Namen erhalten (signiert werden). Um die Assembly zu signieren, wählen Sie die Option „ReplaceProvider-Eigenschaften...“ aus dem Menü „Projekt“ aus.

  7. Aktivieren Sie auf der Registerkarte „Signieren“ das Kontrollkästchen „Assembly signieren“.

  8. Wählen Sie im Kombinationsfeld die Option <Neu...> aus, um einen neuen Schlüssel zu erstellen. Geben Sie im Dialogfeld „Schlüssel mit starkem Namen erstellen“ den Namen „DemoKey.snk“ ein und deaktivieren Sie das Kontrollkästchen „Meine Schlüsseldatei mit einem Kennwort schützen“. Klicken Sie auf OK.
    Screenshot of the Create Strong Name Key dialog, which contains the Key file name, Enter password, and Confirm password fields.
    Die Registerkarte „Signieren“ sollte wie folgt aussehen:
    Screenshot of the signing tab showing the entered key file name in the Choose a strong name key file field.

  9. Wählen Sie die Registerkarte „Buildereignisse“ aus, und fügen Sie die folgende Befehlszeile für das „Postbuildereignis“ hinzu:

    CALL %VS90COMNTOOLS%\vsvars32.bat> NULL
    gacutil.exe /if "$(TargetPath)"

    Hinweis: Wenn Sie Visual Studio 2010 verwenden, ersetzen Sie %VS90COMNTOOLS% durch %VS100COMNTOOLS%.

Implementieren der Anbieterschnittstellen

Um einen Rewrite-Anbieter zu implementieren, führen Sie die folgenden Schritte aus:

  1. Wählen Sie im „Projekt“-Menü die Option „Klasse hinzufügen...“ aus, und geben Sie der Klasse den Namen ReplaceProvider. Dadurch wird dem Projekt eine neue Datei ReplaceProvider.cs hinzugefügt.
  2. Ändern Sie den Code so, dass er wie folgt aussieht:
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
}

Der obige Code implementiert zwei Schnittstellen:

IRewriteProvider – Die Hauptschnittstelle, die implementiert werden muss. Sie wird verwendet, um den Anbieter durch Übergabe der Konfigurationseinstellungen zu initialisieren. Außerdem wird sie verwendet, um den Anbieter auszuführen.

IProviderDescriptor – Dies ist eine optionale Schnittstelle, mit der Sie IIS Manager über die Namen und Beschreibungen der vom Provider verwendeten Konfigurationseinstellungen informieren können.

Registrieren und Konfigurieren des Anbieters

Nachdem der Anbieter erfolgreich integriert und in das GAC eingefügt wurde, muss er beim URL-Rewrite-Modul von IIS registriert werden. So wird der Anbieter registriert:

  1. Öffnen Sie den IIS-Manager, und wählen Sie das URL-Rewrite-Feature aus.
  2. Klicken Sie auf die Aktion „Anbieter anzeigen“:
    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. Klicken Sie auf der Seite „Anbieter“ auf die Aktion „Anbieter hinzufügen...“, geben Sie den Namen des Anbieters als „ReplaceProvider“ ein, und wählen Sie den Anbietertyp aus der Dropdownliste „Verwalteter Typ:“ aus.
    Screenshot of the View Providers option in the Actions pane.
  4. Klicken Sie zum Speichern der Änderungen auf OK.
  5. Klicken Sie auf die Aktion „Anbietereinstellung hinzufügen...“. In der Dropdownliste „Name:“ werden die Einstellungen angezeigt, die von der Methode IProviderDescriptor.GetSettings() zurückgegeben wurden. Wählen Sie „Altes Zeichen“ aus, und geben Sie „_“ als Wert ein.
    Screenshot of the Edit Provider Setting screen within the Rewrite Providers section of the I I S Manager screen.
  6. Klicken Sie auf „OK“, um die Einstellung zu speichern.
  7. Wiederholen Sie die Schritte 5 und 6, wählen Sie aber jetzt „Neues Zeichen“ aus, und geben Sie „-“ als Wert an. Das bedeutet, dass der Anbieter alle Vorkommen von „_“ durch „-“ in der Eingabezeichenfolge ersetzen wird.

Damit ist die Registrierung und Konfiguration des Rewrite-Anbieters abgeschlossen. Infolgedessen enthält die Datei „web.config“ für die Standardwebsite den folgenden XML-Code innerhalb des Abschnitts <rewrite>:

<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>

Verwenden des Rewrite-Anbieters

Nachdem der Rewrite-Anbieter registriert wurde, kann er in den Eingangs- und Ausgangsregeln verwendet werden. Um den Anbieter zu testen, erstellen Sie eine Regel, die alle Anforderungen für URLs, die das Symbol „_“ enthalten, auf die URL umleitet, bei der dieses Zeichen durch „-“ ersetzt wurde. Beispielsweise wird eine Anforderung an eine URL wie diese http://localhost/some_blog_post/ umgeleitet an http://localhost/some-blog-post/.

Um eine Regel zu erstellen, die diesen Rewrite-Anbieter verwendet, fügen Sie den folgenden XML-Code innerhalb des <rewrite>-Elements in der Datei „web.config“ hinzu:

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

Öffnen Sie einen Webbrowser, und senden Sie eine Anforderung an http://localhost/some_blog_post/.. Beachten Sie, dass der Browser aufgrund der von Ihnen hinzugefügten Regel auf http://localhost/some-blog-post/ umgeleitet wurde. Der Webserver gibt einen HTTP 404-Fehler für die umgeleitete URL zurück, da es keine solche Datei oder kein solches Verzeichnis auf dem Server gibt, aber das ist für die Zwecke dieser exemplarischen Vorgehensweise nicht relevant. Der wichtige Teil ist, dass der Webserver eine Umleitungsantwort basierend auf der Regel ausgegeben hat, die den benutzerdefinierten Rewrite-Anbieter verwendet hat.