Устаревшие перенаправленные устаревшие маршруты для статических файлов в ASP.Net MVC - PullRequest
5 голосов
/ 12 января 2011

Наш старый сайт ASP.net хранил статические изображения в подкаталоге в корне под названием / images .

Наш новый сайт ASP.net MVC сохраняет эти изображения в новом макете / Content / Images

Я изменил все страницы сайта, чтобы справиться с новой структурой папок, но я бы хотел настроить перманентные перенаправления со старых статических изображений на новое место.

Наш сайт размещен, и у меня нет контроля над IIS, так как лучше всего решить эту проблему?

1 Ответ

6 голосов
/ 12 января 2011

Я использую следующий код для своих сайтов MVC 2:

// 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();
    }
}

Затем я просто добавляю устаревшие маршруты в мою карту маршрутов:

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