2010-06-08 7 views
7

que estoy usando la caché de resultados en mi controlador HTTP personalizado de la siguiente manera:almacenamiento en caché de salida en el controlador HTTP y SetValidUntilExpires

public void ProcessRequest(HttpContext context) 
    { 
     TimeSpan freshness = new TimeSpan(0, 0, 0, 60); 
     context.Response.Cache.SetExpires(DateTime.Now.Add(freshness)); 
     context.Response.Cache.SetMaxAge(freshness); 
     context.Response.Cache.SetCacheability(HttpCacheability.Public); 
     context.Response.Cache.SetValidUntilExpires(true); 
     ... 
    } 

Funciona, pero el problema es que actualizar la página con F5 lleva a la página de la regeneración (en lugar de utilizar el caché) a pesar de la última línea de código:

context.Response.Cache.SetValidUntilExpires(true); 

¿Alguna sugerencia?

UPD: Parece que la causa del problema es que la respuesta del manejador HTTP no está almacenando en caché en el servidor. El siguiente código funciona bien para en forma de banda, pero no para el manejador:

 Response.Cache.SetCacheability(HttpCacheability.Server); 

¿Hay algunos aspectos específicos del almacenamiento en caché la respuesta controlador HTTP en el servidor?

Respuesta

18

que he encontrado la razón. El parámetro de cadena de consulta está usando en mi URL, por lo que se ve como "http://localhost/Image.ashx?id=49". He pensado que si VaryByParams no está configurado explícitamente, el servidor siempre tendrá en cuenta el valor de id param, porque context.Response.Cache.VaryByParams.IgnoreParams es falso de forma predeterminada. Pero, de hecho, el servidor no utiliza caché en absoluto en este caso (sin embargo, el navegador del usuario sí).

Por lo tanto, si los parámetros están utilizando en la cadena de consulta, Response.Cache.VaryByParams deben establecerse de forma explícita, como

context.Response.Cache.VaryByParams.IgnoreParams = true; 

para los parámetros ignorando o

context.Response.Cache.VaryByParams[<parameter name>] = true; 

para la variación de algunos parámetros o

context.Response.Cache.VaryByParams["*"] = true; 

para la variación por todos los parámetros.

+0

Gracias por encontrar esta solución, funcionó para mí con parámetros de consulta de un solo valor. Pero cuando tengo un parámetro multivaluado como '? Id = 1 & id = 2 & id = 3', esto todavía no funciona. Todavía no sé por qué, pero quería que otros lo supieran. – Oliver

0

cacheability público depende del navegador del usuario o proxy que especifica que la respuesta es cacheable por los clientes y cachés compartidos (proxy).

tenían intentado utilizar HttpCacheability.Server

http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx

+0

Lo he intentado, pero en este caso el almacenamiento en caché no funciona en absoluto. Yo uso el servidor de desarrollo ASP.NET. – mayor

Cuestiones relacionadas