我在ASP.NET MVC中有一个多租户应用程序。将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致)。
应用程序的每个实例可能都有不同的文化设置(甚至是“自动”,以阅读浏览器的语言并尝试使用它),并且将本地化相应
在这种情况下,我想对我的一些操作做一些输出缓存。所以,我的问题是:
如果输出完全取决于主机名,那么实现多租户ASP.NET MVC应用程序的实现输出缓存的可能性是什么?(即,无视本地化要求)?
与(1)相同,但现在考虑输出还取决于文化设置?
与(2)相同,但考虑到传递给动作的输出可能因参数而有所不同?
在这种情况下,我正在考虑从一个IIS网站运行所有网站。
答案 0 :(得分:57)
我刚刚想出如何实现这一目标。
只需使用VaryByHeader
属性,设置为"host"
即可。有很多种可能性。
使用OutputCacheAttribute
传递所有必需的配置元素,包括VaryByHeader
:
public class HomeController : Controller
{
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByHeader = "host")]
public ActionResult Index() { /* ... */ }
}
或者您可以将其设置为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() { /* ... */ }
}
答案 1 :(得分:0)
如果人们登陆此页面并在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...
}