Compartir a través de


Desarrollo de un proveedor de reescritura personalizado para el módulo URL Rewrite

Por Ruslan Yakushev

Este tutorial le guiará en el desarrollo de un proveedor de reescritura para el módulo URL Rewrite 2.0. Creará un ReplaceProvider que reemplace todas las apariciones de un carácter determinado de la dirección URL por otro carácter. Este tipo de lógica es muy difícil y a veces imposible de expresar en términos de expresiones regulares, de ahí la necesidad de crear un proveedor de reescritura personalizado.

Creación de un proyecto de Visual Studio

Para crear un proyecto de Visual Studio para el proveedor de reescritura, siga estos pasos:

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

  2. En el menú Archivo, seleccione "Nuevo proyecto...".

  3. En el cuadro de diálogo "Nuevo proyecto", seleccione la plantilla de proyecto "Biblioteca de clases" y asigne al proyecto el nombre ReplaceProvider.
    Screenshot of the New Project dialog with Class Library project template option being highlighted.

  4. Quite el archivo Class1.cs agregado de forma predeterminada (ya que no lo va a usar) con la opción Eliminar del menú contextual del Explorador de soluciones.

  5. Seleccione "Agregar referencias..." en el menú Proyecto y agregue referencias a Microsoft.Web.Iis.Rewrite.dll, que se encuentra en %ProgramFiles%\Reference Assemblies\Microsoft\IIS.

  6. Los proveedores de reescritura deben colocarse en la caché global de ensamblados (GAC) de .NET para que sea visible para el módulo URL Rewrite. Para ello, el archivo DLL del ensamblado del proveedor debe tener un nombre seguro (firmado). Para firmar el ensamblado, seleccione la opción "Propiedades de ReplaceProvider..." en el menú "Proyecto".

  7. En la pestaña Firma, active la casilla "Firmar el ensamblado".

  8. En el cuadro combinado, seleccione la opción <Nuevo...> para crear una clave. En el cuadro de diálogo "Crear clave de nombre seguro", escriba DemoKey.snk como nombre de la clave y desactive la casilla "Proteger mi archivo de clave con una contraseña". Haga clic en OK.
    Screenshot of the Create Strong Name Key dialog, which contains the Key file name, Enter password, and Confirm password fields.
    La pestaña Firma debe tener el siguiente aspecto:
    Screenshot of the signing tab showing the entered key file name in the Choose a strong name key file field.

  9. Seleccione la pestaña "Eventos de compilación" y agregue la siguiente línea de comandos de "Evento posterior a la compilación":

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

    Nota: si usa Visual Studio 2010, reemplace %VS90COMNTOOLS% por %VS100COMNTOOLS%.

Implementación de las interfaces de proveedor

Para implementar un proveedor de reescritura, siga estos pasos:

  1. En el menú Proyecto, seleccione "Agregar clase..." y, a continuación, asigne a la clase el nombre ReplaceProvider. Se agregará un nuevo archivo ReplaceProvider.cs al proyecto.
  2. Cambie el código para que tenga el aspecto siguiente:
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
}

El código anterior implementa dos interfaces:

IRewriteProvider: esta es la interfaz principal que se debe implementar. Sirve para inicializar el proveedor pasándole sus valores de configuración. También sirve para ejecutar el proveedor.

IProviderDescriptor: es una interfaz opcional y se puede usar para informar al Administrador de IIS de los nombres y descripciones de las opciones de configuración que usa el proveedor.

Registro y configuración del proveedor

Una vez que el proveedor se ha compilado y colocado correctamente en la GAC, debe registrarse en el módulo URL Rewrite de IIS. Para registrar el proveedor:

  1. Abra el Administrador de IIS y seleccione la característica Reescritura de direcciones URL.
  2. Haga clic en la acción "Ver proveedores...":
    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. En la página "Proveedores", haga clic en la acción "Agregar proveedor...", escriba el nombre del proveedor "ReplaceProvider" y, a continuación, elija el tipo de proveedor en la lista desplegable "Tipo administrado:".
    Screenshot of the View Providers option in the Actions pane.
  4. Haga clic en Aceptar para guardar los cambios.
  5. Ahora haga clic en la acción "Agregar configuración de proveedor...". Observe que la lista desplegable "Nombre:" muestra la configuración que ha devuelto el método IProviderDescriptor.GetSettings(). Seleccione "Configuración de caracteres antigua" y escriba "_" como valor.
    Screenshot of the Edit Provider Setting screen within the Rewrite Providers section of the I I S Manager screen.
  6. Haga clic en Aceptar para guardar la configuración.
  7. Repita los pasos 5 y 6, pero ahora elija "Nuevo carácter" y especifique "-" como valor. Esto significa que el proveedor se usará para reemplazar todas las apariciones del carácter "_" por el carácter "-" en la cadena de entrada.

Esto completa el registro y la configuración de un proveedor de reescritura. Como resultado, el archivo web.config del sitio web predeterminado contendrá el siguiente código XML dentro de la sección <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>

Uso del proveedor de reescritura

Ahora que el proveedor de reescritura se ha registrado, se puede usar en las reglas de entrada y salida. Para probar el proveedor, creará una regla que redirija todas las solicitudes de direcciones URL que tengan el símbolo "_" a la dirección URL donde ese símbolo se reemplace por "-". Por ejemplo, una solicitud a una dirección URL como http://localhost/some_blog_post/ se redirigirá a http://localhost/some-blog-post/.

Para crear una regla que use este proveedor de reescritura, agregue el siguiente código XML dentro del elemento <rewrite> del archivo web.config:

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

Abra un explorador web y haga una solicitud a http://localhost/some_blog_post/.. Observe que el explorador se ha redirigido a http://localhost/some-blog-post/ debido a la regla que ha agregado. El servidor web devolverá el error HTTP 404 para la dirección URL redirigida porque no hay ningún archivo o directorio de ese tipo en el servidor, pero eso no es relevante para los fines de este tutorial. Lo importante es que el servidor web emitió una respuesta de redirección basada en la regla que usó el proveedor de reescritura personalizado.