Partager via


Développement d’un fournisseur de réécriture personnalisé pour le module de réécriture d’URL

Auteur : Ruslan Yakushev

Cette procédure pas à pas vous guide tout au long du développement d’un fournisseur de réécriture pour le module de réécriture d’URL 2.0. Vous allez créer un ReplaceProvider qui remplace toutes les occurrences d’un caractère particulier dans l’URL par un autre caractère. Ce type de logique est vraiment difficile et parfois impossible à exprimer en termes d’expressions régulières, donc la nécessité de créer un fournisseur de réécriture personnalisé.

Création d’un projet Visual Studio

Pour créer un projet Visual Studio pour le fournisseur de réécriture, procédez comme suit :

  1. Ouvrez Microsoft Visual Studio 2008 ou Microsoft Visual C# 2008 Express Edition.

  2. Dans le menu Fichier, sélectionnez « Nouveau projet... ».

  3. Dans la boîte de dialogue « Nouveau projet », sélectionnez le modèle de projet « Bibliothèque de classes » et nommez le projet ReplaceProvider.
    Screenshot of the New Project dialog with Class Library project template option being highlighted.

  4. Supprimez le fichier Class1.cs ajouté par défaut (car vous n’utiliserez pas ce fichier) à l’aide du menu contextuel 'option Supprimer dans l’Explorateur de solutions ;

  5. Sélectionnez « Ajouter des références... » dans le menu Project et ajoutez des références à Microsoft.Web.Iis.Rewrite.dll situées dans %ProgramFiles%\Reference Assemblies\Microsoft\IIS.

  6. Les fournisseurs de réécriture doivent être placés dans le Global Assembly Cache (GAC) .NET afin d’être visibles pour le module de réécriture d’URL. Cela nécessite que la DLL d’assembly du fournisseur soit fortement nommée (signée). Pour signer l’assembly, sélectionnez l’option « ReplaceProvider Properties... » dans le menu « Projet ».

  7. Dans l’onglet Signature, cochez la case « Signer l’assembly ».

  8. Dans la zone de liste déroulante, sélectionnez l’option <Nouvelle…> pour créer une clé. Dans la boîte de dialogue « Créer une clé de nom fort », tapez DemoKey.snk comme nom de la clé et décochez le fichier Protéger mon fichier de clé avec une case à cocher mot de passe. Cliquez sur OK.
    Screenshot of the Create Strong Name Key dialog, which contains the Key file name, Enter password, and Confirm password fields.
    L’onglet Signature doit se présenter comme suit :
    Screenshot of the signing tab showing the entered key file name in the Choose a strong name key file field.

  9. Sélectionnez l’onglet « Événements de build » et ajoutez la ligne de commande « Événement post-build » suivante :

    APPELER %VS90COMNTOOLS%\vsvars32.bat> NULL
    gacutil.exe /if « $(TargetPath) »

    Remarque : si vous utilisez Visual Studio 2010, remplacez %VS90COMNTOOLS% par %VS100COMNTOOLS%.

Implémentation des interfaces de fournisseur

Pour implémenter un fournisseur de réécriture, procédez comme suit :

  1. Dans le menu Projet, sélectionnez « Ajouter une classe... », puis nommez la classe en tant que ReplaceProvider. Cela ajoute un nouveau fichier ReplaceProvider.cs au projet.
  2. Modifiez le code pour qu’il ressemble à ce qui suit :
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
}

Le code ci-dessus implémente deux interfaces :

IRewriteProvider : il s’agit de l’interface principale à implémenter. Il est utilisé pour initialiser le fournisseur en lui transmettant ses paramètres de configuration. Il est également utilisé pour exécuter le fournisseur.

IProviderDescriptor - il s’agit d’une interface facultative et peut être utilisé pour informer le Gestionnaire IIS des noms et descriptions des paramètres de configuration utilisés par le fournisseur.

Inscription et configuration du fournisseur

Une fois que le fournisseur a été correctement généré et placé dans le GAC, il doit être inscrit auprès du module de réécriture d’URL IIS. Pour inscrire le fournisseur :

  1. Ouvrez le Gestionnaire IIS et sélectionnez la fonctionnalité de réécriture d’URL
  2. Cliquez sur « Afficher les fournisseurs... » Action:
    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. Dans la page Fournisseurs, cliquez sur Ajouter un fournisseur... action, puis entrez le nom du fournisseur en tant que ReplaceProvider et choisissez le type de fournisseur dans la liste déroulante Type managé :
    Screenshot of the View Providers option in the Actions pane.
  4. Cliquez sur OK pour enregistrer les modifications.
  5. Cliquez maintenant sur « Ajouter un paramètre de fournisseur ... » Action. Notez que la liste déroulante « Name : » affiche les paramètres retournés par la méthode IProviderDescriptor.Get Paramètres(). Sélectionnez le paramètre Ancien caractère et entrez « _ » comme valeur.
    Screenshot of the Edit Provider Setting screen within the Rewrite Providers section of the I I S Manager screen.
  6. Cliquez sur OK pour enregistrer le paramètre
  7. Répétez les étapes 5 et 6, mais choisissez maintenant « Nouveau caractère » et spécifiez « - » comme valeur. Cela signifie que le fournisseur sera utilisé pour remplacer toutes les occurrences de caractère « _ » par « - » dans la chaîne d’entrée.

Cette opération termine l’inscription et la configuration d’un fournisseur de réécriture. Par conséquent, le fichier web.config du site web par défaut contient le code XML suivant à l’intérieur de la <rewrite> section :

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

Utilisation du fournisseur de réécriture

Maintenant que le fournisseur de réécriture a été inscrit, il peut être utilisé dans les règles entrantes et sortantes. Pour tester le fournisseur, vous allez créer une règle qui redirige toutes les demandes d’URL qui ont le symbole « _ » vers l’URL où ce symbole est remplacé par « - ». Par exemple, une requête vers une URL comme celle-ci http://localhost/some_blog_post/ sera redirigée vers http://localhost/some-blog-post/.

Pour créer une règle qui utilise ce fournisseur de réécriture, ajoutez le code XML suivant à l’intérieur de l’élément <rewrite> dans le fichier web.config :

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

Ouvrez un navigateur web et faites une demande de http://localhost/some_blog_post/. notification indiquant que le navigateur a été redirigé en http://localhost/some-blog-post/ raison de la règle que vous avez ajoutée. Le serveur web retourne une erreur HTTP 404 pour l’URL redirigée, car il n’existe aucun fichier ou répertoire sur le serveur, mais cela n’est pas pertinent pour les besoins de cette procédure pas à pas. Le composant important est que le serveur web a émis une réponse de redirection en fonction de la règle qui a utilisé le fournisseur de réécriture personnalisé.