c# - MVC 3 Multi-Tenancy 和 View 编译缓存问题

标签 c# asp.net asp.net-mvc asp.net-mvc-3 multi-tenant

关于 ASP.NET MVC 3 中的一种 Multi-Tenancy 实现,我有一个无法预料的问题。

假设我有 2 个网站:example.comexample.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/

相关文章:

c# - 这是使用MVVM Light Messenger类的正确方法吗

c# - 阿拉伯文本框

html - ASP.NET MVC4 - 将包含字符串的 HTML 显示为原始 HTML

asp.net-mvc - 将 App_Start 更改为 AppStart

c# - Asp.net MVC 5 - 查看将空数据发布到 Controller

c# - 错误 : The path is not of a legal form while using NReco. 视频转换器

c# - 当 IsReadOnly 是接口(interface)成员时,List<T> 如何使 IsReadOnly 私有(private)?

c# - WebBrowser 样式在 WinForms 中应用不正确

asp.net - asp.net mvc 中的 Controller 重用

c# - ASP.NET MVC 中的分页和排序网格