我有一个关于在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