2009-10-01 8 views
7

Tengo un proveedor de ruta virtual. El problema es que almacena en caché mis archivos. Cada vez que edito manualmente uno de los archivos aspx que hace referencia a que VPP no extrae el nuevo archivo, continúa reutilizando el archivo anterior hasta que reinicie el sitio.Virtual Path Provider ¿Deshabilitar el almacenamiento en caché?

Incluso he sobre-montó el GetCacheDependency() en mi clase VirtualPathProvider:

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     return null; 
    } 

ideas?

Respuesta

19

La devolución de un nulo le dice esencialmente a ASP.NET que no tiene ninguna dependencia, por lo tanto, ASP.NET no volverá a cargar el elemento.

Lo que necesita es devolver una dependencia válida, p.

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     return new CacheDependency(getPhysicalFileName(virtualPath)); 
    } 

Un enfoque más correcto es asegurarse de que sólo se ocupa de llenar su dependencias de caché (esto es un ejemplo esquemático):

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (isMyVirtualPath(virtualPath)) 
      return new CacheDependency(getPhysicalFileName(virtualPath)); 
     else 
      return new Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 
+1

respuesta correcta más abajo/Chandima Prematillake – r3mark

1
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
{ 
    return IsVirtualPath(virtualPath) ? new CacheDependency(HttpContext.Current.Server.MapPath("~/Resource.xml")) 
            : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
} 
2

No creo que esto es lo que el cartel original pedido. Quiere desactivar completamente el almacenamiento en caché, no implementarlo de una mejor manera, aunque su publicación es útil para este último.

Muchas personas utilizan VirtualPathProvider para extraer datos de una base de datos en lugar de un sistema de archivos. No veo cómo la creación de una dependencia del sistema de archivos sería una forma útil de determinar cuándo es el momento de actualizar el archivo.

¿Cómo lo obligarías a nunca usar el almacenamiento en caché y siempre recuperar la última versión del archivo? Esa es la pregunta.

+0

La respuesta está aquí :) http://stackoverflow.com/questions/3747858/asp-net-mvc-2-virtualpathprovider-getfile-every-time-for-every- request/3766321 # 3766321 – Aliz

14

La forma correcta de deshabilitar el caché es la siguiente:

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (_IsLayoutFile(virtualPath)) 
     { 
      return null; 
     } 
     return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 

    public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies) 
    { 
     if (_IsLayoutFile(virtualPath)) 
     { 
      return Guid.NewGuid().ToString(); 
     } 

     return Previous.GetFileHash(virtualPath, virtualPathDependencies); 
    } 
+0

Según las suposiciones, devolver una dependencia de caché nula obligará al VPP a usar getfilehash? –

+0

Descubrí que es cierto: devolver una CacheDependecy nula obligará a VPP a usar GetFileHash. –

-1

La solución que funcionó para mí, como era deseado:

  • GetCacheDependency: devuelto nulo;
  • GetFileHash: return Guid.NewGuid(). ToString();

Sin embargo, con esta solución resulta colgar el servidor (Cassini, IIS 6, IIS 7, IIS 8). El colgado solo dura unos minutos y luego se entregan los resultados.

También incluí una prueba de ruta/archivo virtual con los mismos resultados. Me metí con los tiempos de espera del navegador.

¿Alguien puede ayudar?

+0

Debe hacer una nueva pregunta. No hacer una pregunta dentro de una respuesta. – Difster

+0

Bien. Preguntado aquí: https: // stackoverflow.com/questions/45320336/virtualpathprovider-disable-caching-hangs-server-iis-and-cassini – jbecker

Cuestiones relacionadas