Freigeben über


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

von Ruslan Yakushev

In dieser Anleitung erfahren Sie, wie Sie einen Umschreibanbieter für das URL Rewrite Module 2.0 entwickeln. Sie erstellen einen ReplaceProvider, der alle Vorkommen eines bestimmten Zeichens in der URL durch ein anderes Zeichen ersetzt. Diese Art von Logik ist wirklich schwierig und manchmal unmöglich, mithilfe regulärer Ausdrücke auszudrücken, daher die Notwendigkeit, einen benutzerdefinierten Umschreibungsanbieter zu erstellen.

Erstellen eines Visual Studio-Projekts

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

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

  2. Wählen Sie im Menü "Datei" "Neues Projekt..." aus.

  3. Wählen Sie im Dialogfeld "Neues Projekt" die Projektvorlage "Klassenbibliothek" aus, und nennen Sie das Projekt ReplaceProvider.
    Screenshot des Dialogfelds

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

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

  6. Rewrite-Anbieter müssen im globalen .NET-Assemblycache (GAC) platziert werden, um für das URL Rewrite Module sichtbar zu sein. Dazu muss die Anbieterassembly-DLL stark benannt (signiert) werden. Um die Assembly zu signieren, wählen Sie die Option "ReplaceProvider-Eigenschaften..." aus dem Menü "Projekt".

  7. Gehen Sie zur Registerkarte "Signierung" und aktivieren Sie 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" "DemoKey.snk" als Namen für den Schlüssel ein, und deaktivieren Sie das Kontrollkästchen "Meine Schlüsseldatei mit Kennwort schützen". Klicke auf OK.
    Screenshot des Dialogfelds
    Die Registerkarte "Signieren" sollte wie folgt aussehen:
    Screenshot der Registerkarte

  9. Wählen Sie die Registerkarte "Erstellungsereignisse" aus und fügen Sie die folgende Befehlszeile für das "Post-Build-Ereignis" 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

Führen Sie die folgenden Schritte aus, um einen Umschreibanbieter zu implementieren:

  1. Wählen Sie im Menü "Projekt" "Klasse hinzufügen..." aus, und benennen Sie die Klasse dann als 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 – dies ist die Hauptschnittstelle, die implementiert werden muss. Er wird verwendet, um den Anbieter zu initialisieren, indem er seine Konfigurationseinstellungen an ihn übergibt. Außerdem wird er verwendet, um den Anbieter auszuführen.

IProviderDescriptor – dies ist eine optionale Schnittstelle und kann verwendet werden, um IIS-Manager über die Namen und Beschreibungen der vom Anbieter verwendeten Konfigurationseinstellungen zu informieren.

Registrieren und Konfigurieren des Anbieters

Nachdem der Anbieter erfolgreich integriert und in das GAC eingefügt wurde, muss er bei IIS URL Rewrite Module registriert werden. So registrieren Sie den Anbieter:

  1. Öffnen Sie den IIS-Manager und wählen Sie die Funktion "URL-Neu schreiben" aus.
  2. Klicken Sie auf die "Ansichtsanbieter..." Aktion:
    Screenshot des I S-Managers mit Fokus auf der Option
  3. Klicken Sie auf der Seite "Anbieter" auf "Anbieter hinzufügen"... und geben Sie dann den Anbieternamen als ReplaceProvider ein, und wählen Sie den Anbietertyp aus der Dropdownliste "Verwalteter Typ" aus.
    Screenshot der Option
  4. Klicken Sie auf OK, um die Änderungen zu speichern.
  5. Klicken Sie jetzt auf "Anbietereinstellung hinzufügen...". Beachten Sie, dass in der Dropdownliste "Name:" die Einstellungen angezeigt werden, die von der IProviderDescriptor.GetSettings()-Methode zurückgegeben wurden. Wählen Sie die Einstellung "Altes Zeichen" aus, und geben Sie "_" als Wert ein.
    Screenshot des Bildschirms
  6. Klicken Sie auf "OK", um die Einstellung zu speichern.
  7. Wiederholen Sie die Schritte 5 und 6, wählen Sie aber jetzt "-" aus, und geben Sie "-" als Wert an. Dies bedeutet, dass der Anbieter verwendet wird, um alle Vorkommen von "_" durch "-" Zeichen in der Eingabezeichenfolge zu ersetzen.

Dadurch wird die Registrierung und Konfiguration eines Umschreibanbieters abgeschlossen. Daher enthält die web.config Datei für die Standardwebsite den folgenden XML-Code innerhalb des <rewrite> Abschnitts:

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

Nachdem der Umschreibanbieter registriert wurde, kann er in den eingehenden und ausgehenden Regeln verwendet werden. Um den Anbieter zu testen, erstellen Sie eine Regel, die alle Anforderungen für URLs umleitet, die das Symbol "_" an die URL haben, in der dieses Symbol durch "-" ersetzt wird. 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 Umschreibanbieter verwendet, fügen Sie den folgenden XML-Code innerhalb des <rewrite> Elements in der web.config Datei 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 Anfrage an http://localhost/some_blog_post/.. Beachten Sie, dass der Browser aufgrund der von Ihnen hinzugefügten Regel zu http://localhost/some-blog-post/ umgeleitet wurde. Der Webserver gibt den HTTP 404-Fehler für die umgeleitete URL zurück, da keine solche Datei oder ein solches Verzeichnis auf dem Server vorhanden ist, aber für diese exemplarische Vorgehensweise nicht relevant ist. Der wichtige Teil ist, dass der Webserver eine Umleitungsantwort basierend auf der Regel ausgegeben hat, die den benutzerdefinierten Umschreibanbieter verwendet hat.