关于 ASP.NET MVC 3 中的一种 Multi-Tenancy 实现,我有一个无法预料的问题。
假设我有 2 个网站:example.com
和 example.fr
。它们都由 IIS 中的同一个 MVC 网站提供服务。
然后我有一个自定义的 VirtualPathProvider
,它基于域为来自不同位置的 View 提供服务。 Controller 总是相同的,只是 View 是从不同的位置获取的。
这一切都很好。问题来自 ASP.NET View 编译。假设两个域都有一个具有相同名称和路径的 View (为清楚起见,MVC View 路径):
example.com/Views/MyController/Index.cshtml
example.fr/Views/MyController/Index.cshtml
这应该运作良好。但是 ASP.NET BuildManager(将 Razor 代码编译为程序集)仅基于虚拟路径缓存构建。
所以这意味着当我在访问 example.com
时首次呈现 View 时,我得到了正确的 View 。但是,如果我随后尝试在 example.fr
的上下文中呈现 View ,ASP.NET 认为该 View 未被修改(这是真的,因为虚拟路径是相同的)并且它将从缓存中执行 View ,从而呈现不正确的 View 。
解决它的一种方法是根据域在不同的命名空间中编译 View 。
到目前为止,我已到达 MvcWebRazorHostFactory
,覆盖 CreateHost
方法以返回具有正确命名空间的 RazorEngineHost
。不确定它是否会起作用,因为我认为那时我没有所有需要的信息(HttpContext
就是其中之一)
有人有什么想法吗?我在这里遗漏了什么明显的东西吗?
谢谢
最佳答案
好的,事实证明解决起来很简单。
我所要做的就是覆盖 VirtualPathProvider
中的 GetCacheKey
并返回一个考虑了主机名的 key 字符串。
在我的例子中,我只是连接主机和虚拟路径并返回结果字符串的哈希码。
关于c# - MVC 3 Multi-Tenancy 和 View 编译缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11627930/