2011-01-12 16 views
5

古いASP.netサイトでは、ルート上のサブディレクトリに、静止画像が/imagesという名前で保存されていました。ASP.Net MVCの静的ファイルの恒久リダイレクトレガシールート

当社の新しいASP.net MVCサイトは、私は新しいフォルダ構造に対処するために、サイト内のすべてのページを変更しましたが、私は」/コンテンツ/画像の新しいレイアウト

にこれらの画像を保存します永続的なリダイレクトを古い静止画像から新しい場所に設定するのが好きです。

私たちのサイトはホストされており、私はIISを制御できませんので、これを解決する最良の方法は何ですか?

+1

それは私のWebホストは私に持たせなかったことが判明しますIISを制御するため、私は自分の要件を満たすためにUrl Rewritingモジュールを使用することができました。しかし、私は自分がいると思っていた状況にいる人にコミュニティが回答を提供する場合にこの質問を残します。 –

答えて

6

私は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())); 
+0

+1このコードをどうやって使用しますか? LegacyHandler、MVC3用の.csファイルはどこに作成しますか? 〜/ products.aspx?id = 1 – Picflight

+0

'httpContext.Response.StatusCode = 301;'という行を追加します。私はまた**最後にスラッシュを追加するコードを削除する必要がありました**なぜなら '?foo = bar'から'?foo = bar/'にURLパラメータを壊していたからです。 'bar /'は 'foo'に対して有効な値ではありません。 – ANeves

+0

このコード(または非常に似ている)を使ったブログ記事があり、より完全に使用法を説明しています - http://www.eworldui.net/blog/post/2008/04/aspnet-mvc---legacy-url-routing.aspx –

関連する問題