代码之家  ›  专栏  ›  技术社区  ›  Bruno Reis

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

  •  23
  • Bruno Reis  · 技术社区  · 14 年前

    我有一个 多租户应用程序 在ASP.NET MVC中。将要提供的应用程序的实例是 主机名 独自一人(我想是沿着stackexchange的路线)。

    应用程序的每个实例可能具有 不同的文化 设置(甚至“自动”,读取浏览器的语言并尝试使用它),将 局限的 因此。

    在这种情况下,我想做一些 输出缓存 我的一些行为。所以,我的问题是:

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

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

    3. 与(2)相同,但考虑到 输出可能随参数变化 那是传给行动的?

    在本例中,我考虑所有站点都运行在单个IIS网站上。

    2 回复  |  直到 6 年前
        1
  •  56
  •   Bruno Reis    14 年前

    我刚刚知道如何做到这一点。

    简单地使用 VaryByHeader 属性,设置为 "host" . 这样做的可能性有很多。

    方法1

    使用 OutputCacheAttribute 传递所有需要的配置元素,包括 可变字节标头 :

    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.

    或者您可以将 输出缓存属性 使用它:

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

    然后使用它:

    public class HomeController : Controller
    {  
        [MultitenantOutputCache]
        public ActionResult Index() { /* ... */ }
    }
    
        2
  •  0
  •   Nathan    6 年前

    如果人们登录此页并在ASP.NET 2.x中查找等效项,则该属性将如下所示:

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

    您将需要添加中间件。你需要 this nuget package 这个代码:

    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...
    }
    

    More details here