asp.net - route - environment tag helper
Caché de salida para aplicaciones de varios usuarios, que varía según el nombre de host y la cultura (1)
Tengo una aplicación multi-tenant en ASP.NET MVC. La instancia de la aplicación que se servirá es función del nombre de host solo (algo parecido a stackexchange, supongo).
Cada instancia de la aplicación puede tener una configuración cultural diferente (incluso "automática", para leer el idioma del navegador y tratar de usarla), y se localizará en consecuencia.
En esta situación, me gustaría hacer un almacenamiento en caché de salida en algunas de mis acciones. Entonces, mis preguntas son:
¿Cuáles son las posibilidades de lograr el almacenamiento en memoria caché de salida de una aplicación ASP.NET MVC multi-tenant, si la salida depende exclusivamente del nombre de host (es decir, ignorando el requisito de localización)?
Lo mismo que (1), pero ahora considerando que la salida también depende de la configuración cultural .
Igual que (2), pero considerando que la salida puede variar con los parámetros que se pasaron a la acción?
En este caso, considero que todos los sitios se ejecutan desde un único sitio web de IIS.
Acabo de descubrir cómo lograr esto.
Simplemente use la propiedad VaryByHeader
, establecida en "host"
. Hay muchas posibilidades para hacerlo.
Método 1
Utilice OutputCacheAttribute
pasando todos los elementos de configuración necesarios, incluido VaryByHeader
:
public class HomeController : Controller
{
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByHeader = "host")]
public ActionResult Index() { /* ... */ }
}
Método 2
O puede configurarlo en un perfil en 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>
Entonces úsalo:
public class HomeController : Controller
{
[OutputCache(CacheProfile = "Multitenant")]
public ActionResult Index() { /* ... */ }
}
Método 3
O puede subclasificar el OutputCacheAttribute
y usarlo:
public sealed class MultitenantOutputCacheAttribute : OutputCacheAttribute
{
public MultitenantOutputCacheAttribute()
{
VaryByHeader = "host";
VaryByParam = "none";
Duration = 3600;
}
}
Entonces úsalo:
public class HomeController : Controller
{
[MultitenantOutputCache]
public ActionResult Index() { /* ... */ }
}