Можно ли переопределить относительный путь ~ / в моем веб-приложении? - PullRequest
1 голос
/ 20 октября 2010

Назад История
В настоящее время я обновляю существующее веб-приложение для поддержки мультитенантной среды. Сегодня мы размещаем приложение на http://www.example.com/MyApp,, но теперь мы должны иметь возможность поддерживать несколько клиентов в одном веб-приложении.

Таким образом, каждый клиент должен иметь доступ к приложению через URL-адреса, такие как: http://www.example.com/MyApp/Client1
http://www.example.com/MyApp/Client2

Веб-приложение представляет собой приложение веб-форм ASP.NET, которое мы также обновляем до версии .NET 4. Я уже реализовал новую маршрутизацию, доступную в ASP.NET 4, и уже установил соответствующие маршруты для поддержки мультитенантная архитектура.

Пример URL http://www.example.com/MyApp/Client1/SomeModule/SomePage.aspx будет направлять и выполнять /MyApp/SomeModule/SomePage.aspx, и у меня есть доступ к клиентской части из RouteData.

НО ...

Основной вопрос:
У нас есть ссылки во многих частях приложения, в которых используются URL-адреса, такие как ~/SomeModule/SomePage.aspx, поэтому при выводе в браузер они по-прежнему будут отображать /MyApp/SomeModule/SomePage.aspx, но я действительно хочу, чтобы он содержал одно из моих значений маршрута для ввода страница клиента, как MyApp/Client1/SomeModule/SomePage.aspsx

Есть ли способ переопределить значение ~/ во всем приложении, не просматривая все приложение и не обновляя ссылки?

Ответы [ 2 ]

0 голосов
/ 25 октября 2010

Мне не кажется возможным переопределить ~/. Мы решили использовать другой подход и создать служебные методы для управления ссылками и путями в нашей мультитенантной среде.

Лучший вариант, который я видел, чтобы на самом деле добиться этого, это реализовать IUrlResolutionService, но мы не смогли успешно выполнить эту работу.

0 голосов
/ 21 октября 2010

Установите для свойства AppRelativeVirtualPath объекта «Страница» желаемый путь.Но вы должны сделать это первым делом после создания вашего обработчика, поскольку каждый элемент управления, добавленный к вашей коллекции Controls, будет наследовать это значение от своего родителя.

Способ сделать это - создать подкласс класса PageHandlerFactory, который отвечает за создание экземпляра Page, когда вы запрашиваете файл .aspx.Переопределите GetHandler с помощью следующего кода:

public override IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
{
    var handler = (Page)base.GetHandlerHelper(context, requestType, VirtualPath.CreateNonRelative(virtualPath), path);
    page.AppRelativeVirtualPath = "...";

    return page;
}

и, конечно, измените регистрацию в разделе httpHandlers в вашем файле web.config, указав новый класс фабрики.

...