我有一個關於在ASP.NET MVC一種多租戶執行3.MVC 3多租戶和查看編譯緩存問題
說我有2個網站無法預料的問題:example.com
和example.fr
。它們都由IIS中的相同MVC網站提供服務。
然後我有一個自定義VirtualPathProvider
,基於域,從不同的位置提供視圖。控制器總是相同的,只有視圖從不同的位置獲取。
這一切都很好。這個問題伴隨着ASP.NET視圖編譯。假設兩個域具有相同的名稱和路徑的視圖(MVC爲清楚起見意見路徑):
example.com/Views/MyController/Index.cshtml
example.fr/Views/MyController/Index.cshtml
這應該很好地工作。但是ASP.NET BuildManager(將Razor代碼編譯爲程序集)緩存了僅基於虛擬路徑的內部版本。
所以這意味着當我第一次訪問example.com
時,我得到了正確的看法。但是,如果我嘗試在example.fr
的上下文中呈現視圖,則ASP.NET認爲視圖未被修改(虛擬路徑相同,這是真實的),並且它將從緩存執行視圖,因此呈現錯誤的視圖。
解決這個問題的一種方法是根據域名在不同的命名空間中編譯視圖。
到目前爲止,我得到了MvcWebRazorHostFactory
,覆蓋CreateHost
方法返回一個RazorEngineHost
與正確的命名空間。不知道它是否會工作,因爲我不認爲我在那一點上有所有需要的信息(HttpContext
是其中之一)
任何人有任何想法?我在這裏錯過了很明顯的東西嗎
感謝
嗨,佩德羅,你可以把這段代碼放在Gist或在線的地方嗎?我正在努力尋找第二個租戶的虛擬路徑時編譯錯誤,它看起來像你可能有它排序 - 也許這只是這個CreateHost我需要擔心,雖然... – mcintyre321 2012-11-29 09:33:58
我認爲這是絕對CreateHost,作爲我按照描述重寫了GetCacheKey,並且可以從我的租戶加載js文件,這只是它正在努力的xshtml。 – mcintyre321 2012-11-29 15:51:59
這個概念的缺點是,當請求每個域的頁面時,您將失去之前完成的緩存。所以基本上你失去了緩存編譯視圖的好處。有沒有更好的解決方案,允許框架在第一次加載後仍然緩存每個單獨的視圖? – 2013-03-22 03:32:56