多租户应用程序的输出缓存,因主机名和文化而异

Bru*_*eis 23 asp.net asp.net-mvc culture caching multi-tenant

我在ASP.NET MVC中有一个多租户应用程序.将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致).

应用程序的每个实例可能具有不同的文化设置(甚至"自动",以阅读浏览器的语言并尝试使用它),并将相应地进行本地化.

在这种情况下,我想对我的一些操作做一些输出缓存.所以,我的问题是:

  1. 如果输出完全取决于主机名(即忽略本地化要求),那么实现多租户ASP.NET MVC应用程序的输出缓存有哪些可能性

  2. 与(1)相同,但现在考虑输出还取决于培养设置

  3. 与(2)相同,但考虑到输出可能随传递给动作的参数而变化

在这种情况下,我正在考虑所有站点都从一个IIS网站运行.

Bru*_*eis 57

我刚刚想出如何实现这一目标.

只需使用该VaryByHeader属性,设置为"host".这样做有很多种可能性.

方法1

使用OutputCacheAttribute传递所有必需的配置元素,包括VaryByHeader:

public class HomeController : Controller
{  
    [OutputCache(Duration = 3600, VaryByParam = "none", VaryByHeader = "host")]
    public ActionResult Index() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

方法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>
Run Code Online (Sandbox Code Playgroud)

然后使用它:

public class HomeController : Controller
{  
    [OutputCache(CacheProfile = "Multitenant")]
    public ActionResult Index() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

方法3.

或者您可以继承OutputCacheAttribute并使用它:

public sealed class MultitenantOutputCacheAttribute : OutputCacheAttribute
{
    public MultitenantOutputCacheAttribute()
    {
        VaryByHeader = "host";
        VaryByParam = "none";
        Duration = 3600;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

public class HomeController : Controller
{  
    [MultitenantOutputCache]
    public ActionResult Index() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)