Condividi tramite


Sviluppo di un provider di riscrittura personalizzato per il modulo di riscrittura URL

di Ruslan Kashšev

Questa procedura dettagliata illustra come sviluppare un provider di riscrittura per url Rewrite Module 2.0. Verrà creato un replaceProvider che sostituisce tutte le occorrenze di un determinato carattere nell'URL con un altro carattere. Questo tipo di logica è davvero difficile e talvolta impossibile esprimere in termini di espressioni regolari, quindi la necessità di creare un provider di riscrittura personalizzato.

Creazione di un progetto di Visual Studio

Per creare un progetto di Visual Studio per il provider di riscrittura, seguire questa procedura:

  1. Aprire Microsoft Visual Studio 2008 o Microsoft Visual C# 2008 Express Edition.

  2. Nel menu File selezionare "Nuovo progetto...".

  3. Nella finestra di dialogo "Nuovo progetto" selezionare il modello di progetto "Libreria di classi" e assegnare al progetto il nome ReplaceProvider.
    Screenshot della finestra di dialogo Nuovo progetto con l'opzione modello di progetto Libreria di classi evidenziata.

  4. Rimuovere il file Class1.cs aggiunto per impostazione predefinita (poiché non si usa tale file) usando l'opzione Elimina del menu di scelta rapida nel Esplora soluzioni;

  5. Selezionare "Aggiungi riferimenti..." dal menu Progetto e aggiungere riferimenti a Microsoft.Web.Iis.Rewrite.dll che si trova in %ProgramFiles%\Reference Assemblies\Microsoft\IIS.

  6. I provider di riscrittura devono essere inseriti nella Global Assembly Cache (GAC) di .NET per essere visibili per il modulo di riscrittura URL. Ciò richiede che la DLL dell'assembly del provider sia fortemente denominata (firmata). Per firmare l'assembly, selezionare l'opzione "ReplaceProvider Properties..." dal menu "Progetto".

  7. Nella scheda Firma selezionare la casella di controllo "Firma l'assembly".

  8. Nella casella combinata selezionare l'opzione <Nuovo per> creare una nuova chiave. Nella finestra di dialogo "Crea chiave con nome sicuro" digitare DemoKey.snk come nome per la chiave e deselezionare la casella di controllo Proteggi il file di chiave con una password. Fare clic su OK.
    Screenshot della finestra di dialogo Crea chiave con nome sicuro contenente i campi Nome chiave, Immettere password e Conferma password.
    La scheda Firma dovrebbe essere simile alla seguente:
    Screenshot della scheda di firma che mostra il nome del file di chiave immesso nel campo Scegli un file di chiave con nome sicuro.

  9. Selezionare la scheda "Build Events" (Eventi di compilazione) e aggiungere la riga di comando "Post-build event" seguente:

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

    Nota: se si usa Visual Studio 2010, sostituire %VS90COMNTOOLS% con %VS100COMNTOOLS%.

Implementazione delle interfacce del provider

Per implementare un provider di riscrittura, seguire questa procedura:

  1. Dal menu Progetto selezionare "Aggiungi classe..." e quindi assegnare alla classe il nome ReplaceProvider. Verrà aggiunto un nuovo file ReplaceProvider.cs al progetto.
  2. Modificare il codice in modo che sia simile al seguente:
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
}

Il codice precedente implementa due interfacce:

IRewriteProvider : si tratta dell'interfaccia principale che deve essere implementata. Viene usato per inizializzare il provider passandone le impostazioni di configurazione. Viene usato anche per eseguire il provider.

IProviderDescriptor : si tratta di un'interfaccia facoltativa e può essere usata per informare Gestione IIS sui nomi e le descrizioni delle impostazioni di configurazione usate dal provider.

Registrazione e configurazione del provider

Dopo aver compilato e inserito correttamente il provider nella GAC, deve essere registrato con il modulo di riscrittura URL IIS. Per registrare il provider:

  1. Aprire Gestione IIS e selezionare la funzionalità Riscrittura URL
  2. Fare clic su "Visualizza provider..." Azione:
    Screenshot dell'opzione I S Manager con lo stato attivo sull'opzione Visualizza provider nella sezione Gestisci provider del riquadro Azioni.
  3. Nella pagina Provider fare clic su Aggiungi provider... action e quindi immettere il nome del provider come ReplaceProvider e scegliere il tipo di provider dall'elenco a discesa Tipo gestito: .
    Screenshot dell'opzione Visualizza provider nel riquadro Azioni.
  4. Fare clic su OK per salvare le modifiche.
  5. Fare ora clic su "Aggiungi impostazione provider..." Azione. Si noti che l'elenco a discesa "Name:" mostra le impostazioni restituite dal metodo IProviderDescriptor.GetSettings(). Selezionare l'impostazione Carattere precedente e immettere "_" come valore.
    Screenshot della schermata Modifica impostazione provider all'interno della sezione Riscrivi provider della schermata I S Manager.
  6. Fare clic su OK per salvare l'impostazione
  7. Ripetere i passaggi 5 e 6, ma ora scegliere "Nuovo carattere" e specificare "-" come valore. Ciò significa che il provider verrà usato per sostituire tutte le occorrenze di "_" carattere con carattere "-" nella stringa di input.

In questo modo viene completata la registrazione e la configurazione di un provider di riscrittura. Di conseguenza, il file web.config per il sito Web predefinito conterrà il codice XML seguente all'interno della <rewrite> sezione:

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

Uso del provider di riscrittura

Ora che il provider di riscrittura è stato registrato, può essere usato nelle regole in ingresso e in uscita. Per testare il provider, si creerà una regola che reindirizza tutte le richieste di URL con simbolo "_" all'URL in cui tale simbolo viene sostituito con "-". Ad esempio, una richiesta a un URL come questo http://localhost/some_blog_post/ verrà reindirizzato a http://localhost/some-blog-post/.

Per creare una regola che usa questo provider di riscrittura, aggiungere il codice XML seguente all'interno dell'elemento <rewrite> nel file web.config:

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

Aprire un Web browser e fare una richiesta a http://localhost/some_blog_post/. Notare che il browser è stato reindirizzato a http://localhost/some-blog-post/ a causa della regola aggiunta. Il server Web restituirà l'errore HTTP 404 per l'URL reindirizzato perché non esiste un file o una directory di questo tipo nel server, ma non è rilevante ai fini di questa procedura dettagliata. La parte importante è che il server Web ha emesso una risposta di reindirizzamento in base alla regola che ha usato il provider di riscrittura personalizzato.