net mvc example enable dataannotations data curso cache asp c# asp.net asp.net-mvc caching varybyparam

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