c# - mvc - ¿Cómo implementar VaryByCustom caching?
outputcache c# example (4)
Estoy tratando de implementar la funcionalidad para almacenar en caché ciertas páginas dependiendo del host. Esto se debe a que puedo tener múltiples versiones de una página que tienen los mismos parámetros y donde la única diferencia en términos de una solicitud es el host que se solicita.
Entonces, por ejemplo, estas dos URL solicitarán la misma página, pero tienen un estilo diferente:
http://www.a.com/something/specific
y
http://www.b.com/something/specific
Estoy repasando el ejemplo que se resume aquí:
http://msdn.microsoft.com/en-us/library/5ecf4420%28v=VS.90%29.aspx
pero no tiene sentido para mí.
He agregado esto a mi global.asax:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "host")
{
return "host=" + context.Request.Url.Host;
}
return base.GetVaryByCustomString(context, arg);
}
y el ejemplo indica "Para establecer la cadena personalizada mediante programación, llame al método SetVaryByCustom y páselo por la cadena personalizada para usar", con un código similar al siguiente:
Response.Cache.SetVaryByCustom("host");
El problema es que no estoy seguro de qué hacer con esto. He agregado la línea anterior a MvcApplication_EndRequest
porque parece que tiene sentido, pero no creo que sea correcto porque cuando establezco puntos de interrupción en GetVaryByCustomString
nunca reciben ningún golpe.
¿Puede alguien decirme qué me falta aquí? O si necesito hacer esto de manera diferente?
Editar: respuesta de RE Darin a continuación, ya estoy decorando mis acciones con:
[CustomOutputCache(CacheProfile = "FundScreener")] // or similar depending on the action
donde CustomOutputCacheAttribute
se define como:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomOutputCacheAttribute: OutputCacheAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
AddLabelFilesDependency(filterContext);
base.OnResultExecuted(filterContext);
}
private static void AddLabelFilesDependency(ControllerContext filterContext)
{
IConfigurationManager configurationManager = ObjectFactory.TryGetInstance<IConfigurationManager>();
if (configurationManager == null
|| filterContext == null
|| filterContext.RequestContext == null
|| filterContext.RequestContext.HttpContext == null
|| filterContext.RequestContext.HttpContext.Response == null
)
{
return;
}
string[] files = Directory.GetFiles(configurationManager.LabelsDirectoryPath, "*.xml");
foreach(var file in files)
{
filterContext.RequestContext.HttpContext.Response.AddFileDependency(file);
}
}
}
donde el perfil se define como:
<add name="FundScreener"
location="Server"
enabled="true"
varyByParam="*"
duration="1200"
sqlDependency="mmftms:offline.ScreenerData"/>
¿Necesito cambiar esto?
En función de su edición, agregue VaryByCustom="host"
a su perfil de caché de salida de FundScreener.
Si desea tener diferentes cachés para diferentes hosts, puede usar:
VaryByHeader = "host"
Porque eso le haría usar el valor del encabezado "host" en la solicitud para variar el caché. Puede agregar esto en la directiva OutputCache en sus controladores / acciones, o puede especificarlo globalmente en su web.config probablemente.
un encabezado de host siempre estará presente si usa enlaces de host, que parece ser el caso para usted.
GetVaryByCustomString(...)
es llamado por la capa de almacenamiento en caché por solicitud y usted tiene la oportunidad de inspeccionar la solicitud y el argumento transferido para decidir cómo "categorizar" esta solicitud. Por lo tanto, si establece la propiedad / atributo VaryByCustom
en "host", entonces debería escribir el código dentro de la función GetVaryByCustomString
que devuelve el host (como en su ejemplo anterior). Si la capa de almacenamiento en caché encuentra que ya ha almacenado en caché el argumento "host" con el valor que ha devuelto, devolverá la respuesta en caché, de lo contrario, ejecuta la solicitud y la agrega a la memoria caché.
No necesita llamar a SetVaryByCustom
en MVC. Puede usar el atributo OutputCache
. Consulte la siguiente publicación del blog .