Поддържайте URL при преминаване от ASP.NET WebForms към ASP.NET MVC

Преобразувам старо приложение ASP.NET WebForms в ASP.NET MVC 4. Всичко е наред, освен че трябва да поддържам обратна съвместимост с конкретен URL адрес. Намерих тази страхотна публикация за използването на UrlRewrite, но за съжаление това не е нещо, на което мога да разчитам (това приложение се внедрява на много сървъри). В долната част той споменава използването на маршрутизиране, ако имате само малък набор от URL адреси, с които да се справите, но не дава никакъв пример.

Тъй като имам само един URL адрес, с който трябва да се справя, мисля, че маршрутизирането би било простият подход, но никога не съм се занимавал с нищо освен с маршрута по подразбиране /Controller/Action/{id}, така че търся решение, което

  1. Няма външни зависимости
  2. Ще работи на стари скапани браузъри
  3. Няма значение дали приложението ми знае за този стар URL адрес или не

Старият 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

Предистория: това приложение се внедрява на много сървъри на различни места. Има други приложения (които не мога да актуализирам), които показват „Стария URI“ в контрола на уеб браузъра, така че трябва да продължат да работят, след като приложението бъде актуализирано до asp.net mvc.


person Nate    schedule 17.01.2013    source източник
comment
Защо не добавите правило за пренаписване в web.config на вашия проект, както е показано във вашата връзка?   -  person cheesemacfly    schedule 18.01.2013
comment
разглеждали ли сте MapPageRoute()?   -  person James Khoury    schedule 18.01.2013
comment
@cheesemacfly Не мога да разчитам, че модулът за пренаписване на URL адреси е активен на всички сървъри, на които ще разполагам.   -  person Nate    schedule 18.01.2013


Отговори (2)


Нещо като следното трябва да работи (нетествано, може да се наложи този маршрут да бъде един от първите):

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

class LegacyController {
  ActionResult Default (string param1,...){}
}
person Alexei Levenkov    schedule 17.01.2013

Нещо, което можете да опитате, е да създадете httpModule, който ще се изпълни точно преди да натиснете който и да е маршрут във вашето MVC приложение.

Във вашия http модул можете да извършите 301 или 302 пренасочване, ако SEO има значение, това ще ви даде повече гъвкавост за трансформиране на всички параметри от вашето наследство във вашето ново приложение.

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()
    {

    }

}

Мисля, че извършването на пренасочване може да бъде по-чисто решение, ако трябва да промените списъка с параметри в новото си приложение, което също работи с много маршрути, може да стане грозно доста бързо.

person pedrommuller    schedule 18.01.2013