将legecy url映射到MVC控制器和操作

时间:2016-06-14 08:15:14

标签: asp.net asp.net-mvc asp.net-mvc-4 azure

假设我的Web表单应用程序已迁移到MVC应用程序。旧版网络表单网址为http://localhost/Details.aspx?id=100&t=77,用于显示详细信息。

同一页面的新MVC网址为http://localhost/Home/Details/

Controller = Home,Action = Details

搜索引擎抓取工具只有在遗留网址返回响应状态为" 301永久移动"时,搜索引擎抓取工具才会使用与旧网址对应的新网址更新其搜索数据库。新的网址。

我的应用程序托管在Microsoft Azure上。

确保旧网址到达新的mvc控制器和操作的最佳方法是什么。

我尝试了这个,但它无法工作:(

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );


        routes.Add(new LegacyUrlRoute());

    }
}

public class LegacyUrlRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        const string status = "301 Moved Permanently";

        var request = httpContext.Request;
        var response = httpContext.Response;
        var legacyUrl = request.Url.ToString();

        var newUrl = "";

        var id = request.QueryString[0];
        var t = request.QueryString[1];

        if (legacyUrl.Contains(".aspx"))
        {
            newUrl = $"Home/Details?id={id}&t={t}";
            response.Status = status;
            response.RedirectLocation = newUrl;
            response.End();
        }
        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext,
                RouteValueDictionary values)
    {
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

问题是你从你的路线返回null,这使得MVC从不认为它是匹配的路线。但是路由不能自己发出301重定向 - 为此,你需要一个控制器。因此,解决方案是route to a controller and do the 301 from there