多租户应用程序的输出缓存,根据主机名和语言文化进行变化。

23

我有一个ASP.NET MVC的多租户应用程序。提供服务的应用程序实例仅取决于主机名(类似于stackexchange)。

每个应用程序实例可能具有不同的区域设置(甚至可以是“自动”,读取浏览器的语言并尝试使用它),并且将根据其进行本地化

在这种情况下,我想在我的某些操作上进行输出缓存。因此,我的问题是:

  1. 如果输出仅取决于主机名(即忽略本地化要求),则如何在多租户ASP.NET MVC应用程序中实现输出缓存

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

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

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


所有网站都从单个网站运行,还是有多个IIS网站实例? - Richard Szalay
在这种情况下,所有网站都从一个单一的网站运行。 - Bruno Reis
1
太棒了!我有很多类似的情况,就像这样的网站! - Pure.Krome
2个回答

57

我刚刚找到了实现这个的方法。

只需使用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() { /* ... */ }
}

第三种方法。

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

public sealed class MultitenantOutputCacheAttribute : OutputCacheAttribute
{
    public MultitenantOutputCacheAttribute()
    {
        VaryByHeader = "host";
        VaryByParam = "none";
        Duration = 3600;
    }
}

然后使用它:

public class HomeController : Controller
{  
    [MultitenantOutputCache]
    public ActionResult Index() { /* ... */ }
}

HA WIKID!我希望我能为这个答案给更多的分数...太牛逼了,伙计。非常感谢你 :) - Pure.Krome
1
嗨,布鲁诺,我也处于同样的情况。感谢你的解决方案。你是否找到了一种轻松清除每个主机缓存的方法?例如当客户更新他/她的页面时... - Cyril Mestrom
@ Cyril 这个答案提供了有关清除缓存的信息(如果您选择服务器端缓存)。 - Rich C
@RichC 谢谢,但我最终选择了文件系统上的输出缓存。效果很好,而且可以轻松删除。 - Cyril Mestrom

0

如果有人来到这个页面并且正在寻找asp.net 2.x中的等效属性,那么该属性将如下所示:

[ResponseCache(Duration = 30, Location = ResponseCacheLocation.Any, VaryByHeader = "host", VaryByQueryKeys = new string[] { "*" })]

你需要添加中间件。你需要 这个NuGet包 和这段代码:

public void ConfigureServices(IServiceCollection services)
{
    //stuff before...

    services.AddResponseCaching();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //stuff after...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //stuff before...

    app.UseResponseCaching();

    //stuff after...
}

更多细节请点击此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接