tutorial net mvc entre ejemplos diferencias asp c# asp.net asp.net-mvc routing url-rewriting

net - web forms c# ejemplos



¿Cómo enruto las imágenes usando el enrutamiento ASP.Net MVC? (2)

No puede hacer esto "fuera de la caja" con el marco MVC. Recuerde que existe una diferencia entre enrutamiento y reescritura de URL. El enrutamiento es asignar cada solicitud a un recurso, y el recurso esperado es una pieza de código.

Sin embargo, la flexibilidad del marco MVC le permite hacer esto sin ningún problema real. De manera predeterminada, cuando llamas a routes.MapRoute() , está manejando la solicitud con una instancia de MvcRouteHandler() . Puede construir un controlador personalizado para manejar las URL de su imagen.

  1. Cree una clase, tal vez llamada ImageRouteHandler, que implemente IRouteHandler .

  2. Agregue la asignación a su aplicación de esta manera:

    routes.Add("ImagesRoute", new Route("graphics/{filename}",
    new ImageRouteHandler()));

  3. Eso es.

IRouteHandler es como se ve su clase IRouteHandler :

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Compilation; using System.Web.Routing; using System.Web.UI; namespace MvcApplication1 { public class ImageRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { string filename = requestContext.RouteData.Values["filename"] as string; if (string.IsNullOrEmpty(filename)) { // return a 404 HttpHandler here } else { requestContext.HttpContext.Response.Clear(); requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString()); // find physical path to image here. string filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg"); requestContext.HttpContext.Response.WriteFile(filepath); requestContext.HttpContext.Response.End(); } return null; } private static string GetContentType(String path) { switch (Path.GetExtension(path)) { case ".bmp": return "Image/bmp"; case ".gif": return "Image/gif"; case ".jpg": return "Image/jpeg"; case ".png": return "Image/png"; default: break; } return ""; } } }

Actualicé mi sitio para usar ASP.Net MVC desde los formularios web tradicionales de ASP.Net. Estoy usando el enrutamiento MVC para redirigir las solicitudes de páginas antiguas .aspx a su nuevo controlador / equivalente de acción:

routes.MapRoute( "OldPage", "oldpage.aspx", new { controller = "NewController", action = "NewAction", id = "" } );

Esto funciona de maravilla para las páginas porque se asignan directamente a un controlador y a una acción. Sin embargo, mi problema son las solicitudes de imágenes: no estoy seguro de cómo redireccionar esas solicitudes entrantes.

Necesito redirigir las solicitudes entrantes para http://www.domain.com/graphics/image.png a http://www.domain.com/content/images/image.png .

¿Cuál es la sintaxis correcta cuando se usa el método .MapRoute() ?


Si tuviera que hacer esto usando ASP.NET 3.5 Sp1 WebForms, tendría que crear un ImageHTTPHandler independiente que implemente IHttpHandler para manejar la respuesta. Esencialmente, todo lo que tendrías que hacer es poner el código que está actualmente en el método GetHttpHandler en el método ProcessRequest de tu ImageHttpHandler. También movería el método GetContentType a la clase ImageHTTPHandler. También agregue una variable para mantener el nombre del archivo.

Entonces su clase ImageRouteHanlder se ve así:

public class ImageRouteHandler:IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { string filename = requestContext.RouteData.Values["filename"] as string; return new ImageHttpHandler(filename); } }

y tu clase de ImageHttpHandler se vería así:

public class ImageHttpHandler:IHttpHandler { private string _fileName; public ImageHttpHandler(string filename) { _fileName = filename; } #region IHttpHandler Members public bool IsReusable { get { throw new NotImplementedException(); } } public void ProcessRequest(HttpContext context) { if (string.IsNullOrEmpty(_fileName)) { context.Response.Clear(); context.Response.StatusCode = 404; context.Response.End(); } else { context.Response.Clear(); context.Response.ContentType = GetContentType(context.Request.Url.ToString()); // find physical path to image here. string filepath = context.Server.MapPath("~/images/" + _fileName); context.Response.WriteFile(filepath); context.Response.End(); } } private static string GetContentType(String path) { switch (Path.GetExtension(path)) { case ".bmp": return "Image/bmp"; case ".gif": return "Image/gif"; case ".jpg": return "Image/jpeg"; case ".png": return "Image/png"; default: break; } return ""; } #endregion }