2011-03-15 12 views
15

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?

Respuesta

7

No es necesario llamar SetVaryByCustom en MVC. Podría usar el atributo OutputCache. Consulte el following blog post.

+0

Hola Darin, gracias por la respuesta. Todavía estoy un poco confundido. He actualizado la pregunta para ser más específico. – DaveDev

+1

... en realidad, mientras leo más puedo ver que el ejemplo incluye 'varybycustom =" IsLoggedIn "'. ¡Esto podría ser lo que necesito! - Gracias – DaveDev

+0

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

3

GetVaryByCustomString(...) es llamado por la capa de almacenamiento en caché por solicitud y tiene la oportunidad de inspeccionar la solicitud y el argumento transferido para decidir cómo "categorizar" esta solicitud. Entonces, si configuras la propiedad/atributo VaryByCustom en "host", entonces escribirías código dentro de la función GetVaryByCustomString que devuelve el host (como en tu 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é.

0

Sobre la base de su edición, añadir a su VaryByCustom="host" FundScreener perfil de caché de resultados.

4

Si usted quiere tener diferentes caché para diferentes hosts, puede utilizar:

VaryByHeader = "host"

Porque, eso sería hacer que use el valor de cabecera "huésped" en la solicitud de 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.

Cuestiones relacionadas