2010-10-20 44 views
1

Back Story
我目前正在更新現有的Web應用程序以支持多租戶環境。今天,我們目前在http://www.example.com/MyApp上託管應用程序,但現在我們必須能夠在同一個Web應用程序上支持多個客戶端。是否有可能在我的web應用程序中覆蓋相對路徑〜/?

所以每個客戶端應該能夠通過URL來訪問應用程序,如: http://www.example.com/MyApp/Client1
http://www.example.com/MyApp/Client2

Web應用程序是一個ASP.NET Web表單應用程序,我們也升級到使用.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

有沒有辦法覆蓋什麼~/意味着在我的應用程序,而無需通過我的整個應用程序去和更新的鏈接,客戶端頁面的一個?

+0

當使用路由或URL重寫時,它是一個有趣且相關的問題。 – 2010-10-20 20:10:16

+0

@Wallace Breza你是否完成了上述任務?如果是,你可以與我分享這些想法嗎? – GowthamanSS 2013-07-19 07:03:22

回答

0

我似乎不喜歡重寫~/是可能的。我們決定採取不同的方法並創建實用方法來幫助管理我們的多租戶環境中的鏈接和路徑。

我看到實際完成此操作的最佳選擇是實現IUrlResolutionService,但我們無法成功完成此項工作。

0

將頁面對象上的AppRelativeVirtualPath屬性設置爲所需的路徑。但是你必須這樣做,因爲你的處理程序創建後的第一件事情是,因爲添加到你的Controls集合中的每個控件都會從其父項繼承此值。

做到這一點的一種方法是繼承PageHandlerFactory類,該類負責在請求.aspx文件時創建Page實例。用下面的代碼重寫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指向新的工廠類。

+0

我試過了,但改變AppRelativeVirtualPath似乎並不影響我的頁面上的控件(比如HyperLink)中的url。 – 2010-10-21 14:17:45

相關問題