2011-01-12 6 views
5

Nuestro antiguo sitio ASP.net almacenaba imágenes estáticas en un subdirectorio en la raíz llamada /images.Rutas heredadas de redireccionamiento permanente para archivos estáticos en ASP.Net MVC

Nuestro nuevo sitio ASP.net MVC almacena estas imágenes en el nuevo diseño de /contenido/Imágenes

He cambiado todas las páginas en el sitio para hacer frente a la nueva estructura de carpetas, pero yo' Me gusta configurar Redirecciones permanentes desde las imágenes estáticas anteriores a la nueva ubicación.

Nuestro sitio está alojado, y no tengo control sobre IIS, ¿cuál es el mejor enfoque para resolver esto?

+1

Resulta que mi proveedor de alojamiento web no quiero tener control sobre IIS, y por lo tanto pude usar el módulo de Reescritura de Url para cumplir mis requisitos. Sin embargo, dejaré esta pregunta en caso de que la comunidad brinde una respuesta para aquellos que se encuentran en la situación en la que creía estar. –

Respuesta

6

utilizo el siguiente código para mis MVC 2 sitios web:

// The legacy route class that exposes a RedirectActionName 
public class LegacyRoute : Route 
{ 
    public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler) 
     : base(url, routeHandler) 
    { 
     RedirectActionName = redirectActionName; 
     Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index"}); // is not actually called 
    } 

    public string RedirectActionName { get; set; } 
} 

// The legacy route handler, used for getting the HttpHandler for the request 
public class LegacyRouteHandler : MvcRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     requestContext.HttpContext.Response.Write("success"); 
     return new LegacyHandler(requestContext); 
    } 
} 

// The legacy HttpHandler that handles the request 
public class LegacyHandler : MvcHandler 
{ 
    public LegacyHandler(RequestContext requestContext) : base(requestContext) 
    { 
     requestContext.HttpContext.Response.Write("success"); 
     ProcessRequest(requestContext.HttpContext); 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
     string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName; 
     var route = new Route(redirectActionName, ((LegacyRoute)RequestContext.RouteData.Route).Defaults, new MvcRouteHandler()); 

     // Copy all of the querystring parameters and put them within RouteContext.RouteData.Values 
     var values = new Dictionary<string, object>(); 
     foreach (var s in RequestContext.RouteData.Values) 
     { 
      values.Add(s.Key, s.Value); 
     } 
     foreach (var s in httpContext.Request.QueryString.AllKeys) 
     { 
      values.Add(s, httpContext.Request.QueryString[s]); 
     } 
     var data = route.GetVirtualPath(RequestContext, new RouteValueDictionary(values)); 

     httpContext.Response.Status = "301 Moved Permanently"; 
     httpContext.Response.AppendHeader("Location", "/" + data.VirtualPath + "/"); 
     httpContext.Response.End(); 
    } 
} 

Entonces simplemente añadir rutas de legado a mi mapa de rutas:

routes.Insert(13, new LegacyRoute("search", "search/{query}", new LegacyRouteHandler())); 
+0

+1 ¿Cómo se usa este código? ¿Dónde se crea el archivo .cs para LegacyHandler, MVC3? ¿Cómo funciona esto para redirigir url como: ~/products.aspx? Id = 1 – Picflight

+0

Agregaría la línea 'httpContext.Response.StatusCode = 301;'. También ** tuve que eliminar el código para agregar una barra al final ** porque estaba rompiendo mis parámetros de URL de '? Foo = bar' en'? Foo = bar/', y entonces mi Acción arrojaría un error porque 'bar /' no es un valor válido para 'foo'. – ANeves

+0

hay un artículo de blog con este código (o muy similar) que explica el uso más a fondo - http://www.eworldui.net/blog/post/2008/04/aspnet-mvc---legacy-url-routing.aspx –

Cuestiones relacionadas