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.¿Cómo implementar el almacenamiento en caché VaryByCustom?
Así, por ejemplo, estas dos direcciones URL solicitarán la misma página, pero son de estilo diferente:
http://www.a.com/something/specific
y
http://www.b.com/something/specific
que estoy pasando el ejemplo descrito aquí:
http://msdn.microsoft.com/en-us/library/5ecf4420%28v=VS.90%29.aspx
pero no tiene sentido yo.
He añadido 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 estados "para establecer la cadena personalizada mediante programación, llame al método SetVaryByCustom y lo pasan la cadena personalizada para usar", con código similar a la siguiente:
Response.Cache.SetVaryByCustom("host");
el problema es que no estoy seguro de qué hacer con esto. He añadido la línea anterior a MvcApplication_EndRequest
porque parece que tiene sentido, pero no creo que esto es correcto, porque cuando me puse los puntos de interrupción en GetVaryByCustomString
nunca son golpeados.
Puede alguien por favor dígame lo que me falta aquí? O si necesito hacer esto de manera diferente?
Editar: La respuesta de RE Darin más adelante, 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"/>
¿Debo cambiar esto?
Hola Darin, gracias por la respuesta. Todavía estoy un poco confundido. He actualizado la pregunta para ser más específico. – DaveDev
... en realidad, mientras leo más puedo ver que el ejemplo incluye 'varybycustom =" IsLoggedIn "'. ¡Esto podría ser lo que necesito! - Gracias – DaveDev
que hizo el truco ... solo para notar que el atributo distingue entre mayúsculas y minúsculas, por lo que en realidad es 'varyByCustom =" host "' – DaveDev