1

我正在将旧的 ASP.NET WebForms 应用程序转换为 ASP.NET MVC 4。一切都很好,除了我需要保持与特定 URL 的向后兼容性。我发现这篇关于使用 UrlRewrite 的好帖子,但遗憾的是这不是我可以指望的(这个应用程序被部署到很多服务器上)。在底部,他提到如果您只有一小部分 URL 需要处理,则使用路由,但没有提供任何示例。

由于我只有一个 url 要处理,我认为路由将是一种简单的方法,但我从未处理过除了默认路由之外的任何东西,/Controller/Action/{id}所以我正在寻找一种解决方案

  1. 没有外部依赖
  2. 将适用于旧的蹩脚浏览器
  3. 我的应用是否知道这个旧网址并不重要

旧 URI

https://www.mysite.com/default.aspx?parm1=p1&parm2=p2&etc=soforth

新的 URI

https://www.mysite.com/Home/Index/?parm1=p1&parm2=p2&etc=soforth

背景:这个应用程序被部署到不同位置的许多服务器上。还有其他应用程序(我无法更新)在 Web 浏览器控件中显示“旧 URI”,因此我需要它们在应用程序更新到 asp.net mvc 后继续工作。

4

2 回答 2

4

类似以下的东西应该可以工作(未经测试,可能需要使这条路线成为第一条路线之一):

routes.MapRoute(
   "legacyDefaultPage",
   "default.aspx",
   new {Controller = "Legacy", Action="Default"});

class LegacyController {
  ActionResult Default (string param1,...){}
}
于 2013-01-17T23:18:10.087 回答
0

您可以尝试创建一个 httpModule,这将在您的 MVC 应用程序中点击任何路由之前执行。

在您的 http 模块中,如果 seo 很重要,您可以执行301 或 302 重定向,这将使您更灵活地将所有参数从旧应用程序转换为新应用程序。

public class RecirectionModule :IHttpModule{
    public void Init(HttpApplication context)
    {
        _context = context;
        context.BeginRequest += OnBeginRequest;
    }

    public void OnBeginRequest(object sender, EventArgs e)
    {
        string currentUrl = HttpContext.Current.Request.Url.AbsoluteUri;
        string fileExtention = Path.GetExtension(currentUrl);
        string[] fileList= new[]{".jpg",".css",".gif",".png",".js"};

        if (fileList.Contains(fileExtention)) return;

        currentUrl = DoAnyTranformation(currentUrl);
        Redirect(currentUrl);

    }

    private void Redirect(string virtualPath)
    {
        if (string.IsNullOrEmpty(virtualPath)) return;
        _context.Context.Response.Status = "301 Moved Permanently";
        _context.Context.Response.StatusCode = 301;
        _context.Context.Response.AppendHeader("Location", virtualPath);
        _context.Context.Response.End();
    }

    public void Dispose()
    {

    }

}

我认为,如果您需要更改新应用程序中的参数列表并且处理大量路由很快就会变得丑陋,那么进行重定向可能是一种更简洁的解决方案。

于 2013-01-18T04:31:09.257 回答