我在ASP.NET MVC中有一个多租户应用程序。将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致)。
应用程序的每个实例可能具有不同的文化设置(甚至“自动”,以阅读浏览器的语言并尝试使用它),并将相应地进行本地化。
在这种情况下,我想对我的一些操作进行一些输出缓存。所以,我的问题是:
>如果输出完全取决于主机名(即忽略本地化要求),那么实现多租户ASP.NET MVC应用程序的输出缓存有哪些可能性?
>与(1)相同,但现在考虑输出还取决于培养设置?
>与(2)相同,但考虑到输出可能会随传递给动作的参数而变化?
在这种情况下,我考虑所有站点都从一个IIS网站运行。
解决方法
我刚刚想出如何实现这一目标。
只需使用VaryByHeader属性,设置为“host”即可。这样做有很多种可能性。
方法1
使用OutputCacheAttribute传递所有需要的配置元素,包括VaryByHeader:
public class HomeController : Controller { [OutputCache(Duration = 3600,VaryByParam = "none",VaryByHeader = "host")] public ActionResult Index() { /* ... */ } }
方法2。
或者您可以将其设置为Web.config上的配置文件:
<?xml version="1.0"?> <configuration> <!-- ... --> <system.web> <!-- ... --> <caching> <outputCacheSettings> <outputCacheProfiles> <clear/> <add name="Multitenant" enabled="true" duration="3600" varyByHeader="host" varyByParam="none"/> </outputCacheProfiles> </outputCacheSettings> </caching> </system.web> </configuration>
然后使用它:
public class HomeController : Controller { [OutputCache(CacheProfile = "Multitenant")] public ActionResult Index() { /* ... */ } }
方法3。
或者您可以继承OutputCacheAttribute并使用它:
public sealed class MultitenantOutputCacheAttribute : OutputCacheAttribute { public MultitenantOutputCacheAttribute() { VaryByHeader = "host"; VaryByParam = "none"; Duration = 3600; } }
然后使用它:
public class HomeController : Controller { [MultitenantOutputCache] public ActionResult Index() { /* ... */ } }