我在ASP.NET MVC 3中实现了一种多租户方式,但遇到了一个意外问题。假设我有两个网站:
这应该很好用。但是ASP.NET BuildManager(编译Razor代码为程序集)仅基于虚拟路径缓存构建。
这意味着当我在访问example.com时首次呈现视图时,它可以正常工作。但是,如果我尝试在example.fr的上下文中呈现视图,则ASP.NET认为该视图尚未被修改(因为虚拟路径相同),并且会从缓存中执行该视图,因此呈现不正确的视图。
解决办法可能是根据域将视图编译到不同的命名空间中。
到目前为止,我已经使用MvcWebRazorHostFactory重写CreateHost方法,以返回具有正确命名空间的RazorEngineHost。不确定它是否起作用,因为我认为此时缺少所有必要的信息(其中之一是HttpContext)。
任何人有任何想法吗?我错过了明显的东西吗?
谢谢
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)。
任何人有任何想法吗?我错过了明显的东西吗?
谢谢
CreateHost
的问题,因为我按照描述重写了GetCacheKey
,并且可以从我的租户中加载 js 文件,只是 xshtml 有些困难。 - mcintyre321