Compartir a través de


ASP.NET extremos

Distribución con ASP.NET Web Forms

Scott Allen

Descarga de código de la Galería de código de MSDN
Examinar el código en línea

Contenido

Qué es enrutamiento
Un breve historial de reescritura de dirección URL
Rutas y controladores de ruta
Configurar ASP.NET para enrutamiento
Configurar rutas
El controlador de enrutamiento receta
Enrutamiento y seguridad
Generación de la dirección URL
Ajustar hacia arriba con rutas

Service Pack 1 de Microsoft .NET Framework 3.5 introdujo un motor de enrutamiento al tiempo de ejecución ASP.NET. El motor de enrutamiento puede desacoplar la dirección URL de una solicitud HTTP entrante de la física Web formulario que responde a la solicitud, lo que permite crear direcciones URL descriptivo para las aplicaciones Web. Aunque ha sido capaz de utilizar direcciones URL descriptivos en versiones anteriores de ASP.NET, el motor de enrutamiento proporciona un fácil, limpiador y más enfoque comprobable.

El motor de enrutamiento comenzó como una parte del marco controlador ASP.NET de vista de modelo (MVC), que se encuentra en una fase de vista previa de escribir este documento. Sin embargo, Microsoft empaqueta la lógica de enrutamiento en el ensamblado System.Web.Routing y libera el ensamblado con Service Pack 1. El ensamblado actualmente proporciona enrutamiento para sitios Web con características de datos en ASP.NET dinámico (que también se lanzó con Service Pack 1), pero en esta columna demostrará cómo utilizar la funcionalidad de enrutamiento con formularios Web Forms de ASP.NET.

Qué es enrutamiento

Imagine que tiene un formulario Web de ASP.NET denominado RecipeDisplay.aspx y este formulario se encuentra dentro de una carpeta denominada formularios Web Forms. El enfoque clásico para ver una receta con este formulario Web es generar una dirección URL que señala a la ubicación física del formulario y codifican algunos datos en la cadena de consulta para indicar el formulario Web la receta que se va a mostrar. Final de dicha una dirección URL es posible que el siguiente aspecto: /WebForms/RecipeDisplay.aspx?id=5, donde el número 5 representa un valor de clave principal en una tabla de base de datos completa de recetas.

El enrutamiento es fundamentalmente sobre cómo descomponer un extremo de la dirección URL en parámetros y, a continuación, usar esos parámetros que conduzca a la solicitud HTTP procesando para un componente específico. Observemos la receta de dirección URL o 5 como ejemplo. Con la configuración correcta de enrutamiento, aún puede responder a esta dirección URL con la RecipeDisplay.aspx de formulario Web.

La dirección URL ya no representa una ruta de acceso física. En su lugar, la receta palabra representa un parámetro que puede utilizar el motor de enrutamiento para encontrar un componente para procesar las solicitudes de la receta. El número 5 representa un segundo parámetro que necesitará durante el procesamiento de mostrar una receta específica. En lugar de codificación de claves de base de datos en la dirección URL, una idea mejor podría ser utilizar una dirección URL como receta/tacos. Esta dirección URL no sólo incluye suficiente parámetros para mostrar una receta específica, pero es también humano revela legible, su intención de los usuarios finales e incluye importantes palabras clave de motores de búsqueda ver.

Un breve historial de reescritura de dirección URL

En ASP.NET, mediante una dirección URL termina con la receta/tacos tradicionalmente necesario uno para trabajar con una dirección URL reescritura de combinación. Para información detallada en la dirección URL volver a escribir, vea artículo definitiva Scott Mitchell" Dirección URL de reescritura de ASP.NET." El artículo describe la implementación común de dirección URL volver a escribir en ASP.NET mediante un módulo HTTP y el método RewritePath estático de la clase HttpContext. Artículo de Scott también detalla las ventajas de descriptivo, hackable las direcciones URL.

Aquellos que ha usado la API de RewritePath en el pasado está probablemente familiarizados con algunas de las peculiaridades y puntos débiles en el enfoque rewriting. El problema principal con RewritePath es cómo el método cambia la ruta de acceso virtual utilizada durante el procesamiento de una solicitud. Con la reescritura de dirección URL, necesita arreglar el destino de devolución de datos de cada formulario Web (a menudo por volver a escribir la dirección URL de un segundo tiempo durante la solicitud) para evitar las devoluciones de datos a la dirección URL interna, revisada.

Además, la mayoría de programadores implementaría reescritura de dirección URL que una traducción de un solo sentida porque no había ningún mecanismo sencillo para permitir que la dirección URL reescritura de trabajo de lógica en dos direcciones. Por ejemplo, era fácil dar a la dirección URL volver a escribir lógica de una dirección URL pública de cara al y tienen la lógica de devolver la dirección URL interna de un formulario Web. Era difícil proporcionar la lógica rewriting la dirección URL interna de un formulario Web y que devolver la dirección URL pública necesaria para llegar al formulario. El último es útil al generar hipervínculos a otros formularios Web Forms que oculta detrás de las direcciones URL revisadas. Como verá en el resto de esta columna, el motor de enrutamiento de dirección URL sortea estos problemas.

fig01.gif

Figura 1 rutas, distribuir los controladores y el módulo de enrutamiento

Rutas y controladores de ruta

Hay tres reproductores fundamentales en el motor de enrutamiento de dirección URL: rutas, controladores de ruta y el módulo de enrutamiento. Una ruta asocia una dirección URL a un controlador de ruta. Una instancia de la clase de ruta del espacio de nombres System.Web.Routing representa una ruta durante el tiempo de ejecución y describe los parámetros y restricciones de la ruta. Un controlador de ruta se hereda de la interfaz System.Web.Routing.IRouteHandler. Esta interfaz requiere el controlador de ruta para implementar un método GetHttpHandler que devuelve un objeto que implementa la interfaz de IHttpHandler. La interfaz IHttpHandler ha sido una parte de ASP.NET desde el principio y un formulario Web Forms (System.Web.UI.Page) es un IHttpHandler. Cuando se utiliza enrutamiento de formularios Web Forms, los controladores de ruta es necesario buscar, crear una instancia y devolver el formulario Web adecuado. Por último, el módulo de enrutamiento se conecta a la canalización de procesamiento de ASP.NET. El módulo se interceptar las solicitudes entrantes, examine la dirección URL y detectar si hay las rutas coincidentes definidas. El módulo recuperará el controlador de ruta asociada para una ruta coincidente y pedir el controlador de enrutamiento la IHttpHandler que va a procesar la solicitud.

Los tres tipos principales que he mencionado se muestran en la figura 1 . En la sección siguiente, le colocar estos tres reproductores para trabajar.

Configurar ASP.NET para enrutamiento

Para configurar un sitio Web de ASP.NET o una aplicación Web para el enrutamiento, primero debe agregar una referencia al ensamblado System.Web.Routing. La instalación de Service Pack 1 para .NET Framework 3.5 se instale este ensamblado en la caché de ensamblados global y se puede encontrar el ensamblado dentro del cuadro de diálogo Agregar referencia estándar.

También tendrá que configurar el módulo de enrutamiento en la canalización de ASP.NET. El módulo de enrutamiento es un módulo HTTP estándar. IIS 6.0 y versiones anteriores y para el servidor de desarrollo Web de Visual Studio, instalar el módulo utilizando la sección de <httpmodules> de web.config, como puede ver aquí:

<httpModules>      
    <add name="RoutingModule" 
         type="System.Web.Routing.UrlRoutingModule, 
               System.Web.Routing, 
               Version=3.5.0.0, Culture=neutral, 
               PublicKeyToken=31bf3856ad364e35"/>

    <!-- ... -->

</httpModules>

Para ejecutar un sitio Web con el enrutamiento en IIS 7.0, necesitará dos entradas en web.config. La primera entrada es la dirección URL de enrutamiento módulo configuración, que se encuentra en la sección <modules> de <system.webServer>. También necesita una entrada para controlar las solicitudes de UrlRouting.axd en la sección <handlers> de <system.webServer>. De estas entradas aparecen en la figura 2 . Además, consulte la barra lateral " IIS 7.0 las entradas de configuración. "

Configuración de módulo de enrutamiento de dirección URL de la figura 2

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">

      <add name="UrlRoutingModule"
             type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />
      <!-- ... -->

    </modules>
    <handlers>

      <add name="UrlRoutingHandler"
            preCondition="integratedMode"
            verb="*" path="UrlRouting.axd"
            type="System.Web.HttpForbiddenHandler, 
                  System.Web, Version=2.0.0.0, Culture=neutral, 
                  PublicKeyToken=b03f5f7f11d50a3a" />
      <!-- ... -->

    </handlers>
</system.webServer>

Una vez que haya configurado el módulo de enrutamiento de dirección URL en la canalización, conectar Sí a la PostResolveRequestCache y los eventos PostMapRequestHandler. la figura 3 muestra un subconjunto de los eventos de la canalización. Implementaciones de rewriting de dirección URL normalmente realizan su trabajo durante el evento BeginRequest, que es el evento más antigua durante una solicitud. Con dirección URL de enrutamiento, la ruta que coincida con y selección de una ruta de controlador se produce durante la fase PostResolveRequestCache, que es después de la autenticación, autorización y etapas de búsqueda de caché de procesamiento. ES necesario volver a visitar las implicaciones de este intervalo de eventos más adelante en la columna.

fig03.gif

La figura 3 solicitud HTTP

Configurar rutas

Rutas y controladores de ruta van disponible en la mano, pero veremos el código para configurar las rutas en primer lugar. Clase de RouteTable del motor de enrutamiento expone un RouteCollection a través de su propiedad rutas estática. Tiene que configurar todas sus rutas personalizadas en esta colección antes de que la aplicación comience a ejecutar la primera solicitud, lo que significa que debe utilizar un archivo global.asax y el evento Application_Start.

la figura 4 muestra el código de registro de ruta debe utilizar para "/ receta/brownies" para alcanzar el formulario Web RecipeDisplay.aspx. Los parámetros del método Add de la clase RouteCollection incluir un nombre descriptivo para la ruta, seguida por la propia ruta. El primer parámetro al constructor ruta es una trama de la dirección URL. El modelo consta de los segmentos de dirección URL que aparecerán al final de una dirección URL que señala a esta aplicación (después de los segmentos necesario para llegar a raíz de la aplicación). Para una aplicación raíz localhost y alimentos y, a continuación, el modelo de ruta en la figura 4 coincidirá brownies/localhost/alimentos y receta.

Código de registro de ruta de la figura 4 para/receta/brownies

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes();
}

private static void RegisterRoutes()
{
    RouteTable.Routes.Add(
        "Recipe",
        new Route("recipe/{name}", 
                  new RecipeRouteHandler(
                      "~/WebForms/RecipeDisplay.aspx")));
}

IIS 7.0 las entradas de configuración

El atributo runAllManagedModulesForAllRequests requiere un valor true si desea utilizar las direcciones URL extensionless como hacía en este ejemplo. Además, puede parecer extraño para configurar un controlador HTTP para UrlRouting.axd. Esto es una pequeña solución que requiere el motor de enrutamiento para el enrutamiento a trabajo en IIS 7.0. El módulo UrlRouting realmente vuelve a escribir la dirección URL entrante a ~ / UrlRouting.axd, que se vuelva a escribir la dirección URL de la dirección URL original, entrante. Es probable que una versión futura de IIS se integran perfectamente con el motor de enrutamiento y no requiere esta solución.

Segmentos entre llaves llaves indican los parámetros y el motor de enrutamiento se extraer los valores hay y colocarlos en un diccionario de nombre/valor que existirá durante la duración de la solicitud automáticamente. Utilizando el ejemplo anterior de brownies/localhost/alimentos y receta, el motor de enrutamiento se extraer el valor "brownies" y almacenar el valor en el diccionario con una clave de "nombre". Verá cómo utilizar el diccionario cuando mira el código de ruta de controlador.

Puede agregar muchas rutas que necesite en el RouteTable, pero el orden de las rutas es importante. El motor de enrutamiento se probar todas las URL entrantes frente a las rutas de la colección en el orden en que aparecen y el motor de seleccionará la primera ruta con un modelo coincidente. Por este motivo, debe agregar las rutas más específicos en primer lugar. Si se agrega una ruta genérica con el patrón de dirección URL " {Categoría} o {subcategoría} " antes de la ruta receta, el motor de enrutamiento nunca encontraría la ruta de la receta. Una nota adicional, el motor de enrutamiento realiza el modelo de coincidencia de manera que no distingue entre mayúsculas y minúsculas.

Versiones sobrecargadas del constructor ruta permiten crear predeterminado de valores de parámetro y aplican delimitaciones. Los valores predeterminados permiten especificar los valores predeterminados para el motor de enrutamiento colocar en el diccionario de parámetro de nombre/valor al no existe ningún valor para el parámetro en una dirección URL entrante. Por ejemplo, al puede crear "brownies" el nombre de la receta predeterminado cuando el motor de enrutamiento ve una dirección URL de receta sin un valor de nombre (como localhost y alimentos/receta).

Las restricciones permiten especificar expresiones regulares para validar parámetros y ajustar la trama de ruta que coincida con en direcciones URL entrantes. Si estaba utilizando los valores de clave principal para identificar las recetas en una dirección URL (como localhost y alimentos/receta y 5), puede utilizar una expresión regular para garantizar que el valor de clave principal en la dirección URL es un entero. También puede aplicar las restricciones utilizando un objeto que implementa la interfaz IRouteConstraint.

El segundo parámetro al constructor ruta es una nueva instancia de mi controlador de ruta, que veremos en La figura 5 .

La figura 5 RecipeRouteHandler

public class RecipeRouteHandler : IRouteHandler
 {
     public RecipeRouteHandler(string virtualPath)
     {
         _virtualPath = virtualPath;
     }

     public IHttpHandler GetHttpHandler(RequestContext requestContext)
     {
         var display = BuildManager.CreateInstanceFromVirtualPath(
                         _virtualPath, typeof(Page)) as IRecipeDisplay;

         display.RecipeName = requestContext.RouteData.Values["name"] as string;
         return display;
     }

     string _virtualPath;
 }

El controlador de enrutamiento receta

El fragmento de código siguiente muestra una implementación básica de un controlador de ruta para las solicitudes de la receta. Debido a que, en última instancia, tiene el controlador de ruta crear una instancia de un IHttpHandler (en este caso, RecipeDisplay.aspx), el constructor requiere una ruta virtual que apunte al formulario Web el controlador de ruta se cree. El método de GetHttpHandler pasa esta ruta de acceso virtual a la BuildManager ASP.NET para recuperar el formulario Web instancias:

interface IRecipeDisplay : IHttpHandler
{
    string RecipeName { get;  set; }
}

Observe cómo que el controlador de ruta también puede extraer datos del diccionario de parámetro del motor de enrutamiento, que es la propiedad RouteData de la clase RequestContext. El motor de enrutamiento se configura el RequestContext y pasa una instancia cuando invoca este método. Hay muchas opciones disponibles para obtener los datos de ruta en el formulario Web. Puede pasar los datos de ruta a lo largo de la colección Items HttpContext, por ejemplo. En este ejemplo, se ha definido una interfaz para el formulario Web implementar (IRecipeDisplay). El controlador de ruta puede establecer con establecimiento inflexible requiere que las propiedades en el formulario Web para pasar a lo largo de toda la información el formulario Web Forms, y este enfoque se trabajar con tanto el sitio Web de ASP.NET y modelos de compilación de aplicaciones de ASP.NET.

Enrutamiento y seguridad

Cuando se utiliza enrutamiento de ASP.NET, todavía puede utilizar todas las características ASP.NET ha llegue al amor, páginas principales, almacenamiento en caché de resultados, temas, los controles de usuario etc.. Sin embargo, hay una excepción notable. El módulo de enrutamiento funciona su magia utilización de eventos de la canalización que se producen después de las fases de autenticación y autorización de procesamiento, lo que significa que ASP.NET se pueden autorizar a los usuarios con la pública, visible dirección URL y no la ruta virtual al formulario Web de ASP.NET que el controlador de ruta se selecciona para procesar la solicitud. Debe prestar atención cuidado a la estrategia de autorización para una aplicación mediante el enrutamiento.

Vamos a decir que desea permitir sólo los usuarios autenticados ver las recetas. Un enfoque sería modificar el archivo web.config raíz para utilizar la configuración de autorización aquí:

<location path="recipe">
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

Aunque este enfoque impedirá que anónimos los usuarios ver receta/tacos, tiene dos puntos débiles fundamentales. En primer lugar, la configuración no impide un usuario solicita directamente /WebForms/RecipeDisplay.aspx (aunque puede agregar otra regla de autorización que impide que todos los usuarios directamente solicitar recursos de la carpeta de formularios Web Forms). En segundo lugar, es fácil cambiar la configuración de ruta en global.asax.cs sin cambiar las reglas de autorización y dejar las secretas recetas abiertos a anónimo a los usuarios.

Un enfoque alternativo para la autorización sería proteger el formulario Web RecipeDisplay.aspx según su ubicación física, que consiste en colocar los archivos web.config con la configuración de <authorization> directamente en la carpeta protegida. Sin embargo, dado que los usuarios basándose en la dirección URL pública es autorización de ASP.NET, deberá realizar las comprobaciones de autorización manualmente en la ruta de acceso virtual que utiliza el controlador de ruta.

Deberá agregar el código siguiente al principio del método de GetHttpHandler el controlador de ruta. Este código utiliza el método de CheckUrlAccessForPrincipal estático de la clase UrlAuthorizationModule (el mismo módulo que realiza la autorización comprueba de la canalización ASP.NET):

if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(
    _virtualPath, requestContext.HttpContext.User,
                  requestContext.HttpContext.Request.HttpMethod))
{
    requestContext.HttpContext.Response.StatusCode = 
        (int)HttpStatusCode.Unauthorized;
    requestContext.HttpContext.Response.End(); 
}

Para poder tener acceso a los miembros de contexto HTTP a través de la RequestContext, necesitará agregar una referencia al ensamblado System.Web.Abstractions.

Con un controlador de enrutamiento seguro en su lugar, se puede activar su atención a la página que necesita generar hipervínculos para cada receta en la base de datos. Resulta la ruta lógica que puede ayudarle a crear esta página, demasiado.

Generación de la dirección URL

Para generar el hipervínculo para cualquier receta determinado, se una vez más vaya a la colección de rutas configurado durante el inicio de la aplicación. Tal como se muestra aquí, la clase RouteCollection tiene un método de GetVirtualPath para este propósito:

VirtualPathData pathData = 
    RouteTable.Routes.GetVirtualPath(
                  null,
                  "Recipe",
                  new RouteValueDictionary { { "Name", recipeName } });

return pathData.VirtualPath;

Se necesita pasar el nombre de ruta deseada ("receta") junto con un diccionario de los parámetros requeridos y sus valores asociados. Este método utiliza el patrón de dirección URL que creó anteriores (/recipe/ {name}) para generar la dirección URL correcta.

El código siguiente utiliza este método para generar una colección de forma anónima con objetos. Los objetos tienen propiedades Name y URL que puede utilizar con para generar una lista o tabla de recetas disponibles de enlace de datos:

var recipes = 
    new RecipeRepository()
        .GetAllRecipeNames()
        .OrderBy(recipeName => recipeName)
        .Select(recipeName =>
          new
          {
            Name = recipeName,
            Url = GetVirtualPathForRecipe(recipeName)
          });

La capacidad para generar las direcciones URL de la configuración de enrutamiento significa que puede cambiar la configuración sin miedo a la de creación de vínculos rotos dentro de la aplicación. Por supuesto, todavía podría interrumpir vínculos Favoritos del usuario y marcadores, pero tener la posibilidad de cambiar es una enorme ventaja cuando todavía está diseñando estructura de la dirección URL de la aplicación.

Ajustar hacia arriba con rutas

El motor de enrutamiento de dirección URL no todo el trabajo sucio de coincidencia de patrones de dirección URL y generación de la dirección URL. Todo lo que necesita hacer es configurar sus rutas e implementar los controladores de ruta. Con el enrutamiento, está totalmente aislados las extensiones de archivo y el diseño físico de su sistema de archivos y no necesita tratar las peculiaridades de utilizar un rewriter dirección URL. En su lugar, puede concentrar en el diseño óptimo de dirección URL para los usuarios finales y para los motores de búsqueda. Además, Microsoft está trabajando sobre la realización de dirección URL de enrutamiento con formularios Web Forms incluso más fácil y más configurable en el próximo 4.0 de ASP.NET.

Envíe sus preguntas y comentarios a xtrmasp@Microsoft.com.

Allen de Scott es un fundador de OdeToCode y un miembro del personal técnico de Pluralsight. Pueden llegar a Scott a Scott@odetocode.com, o leer su blog en OdeToCode.com/blogs/scott.