Поддерживать 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