2009-04-13 11 views
5

¡Saludos!ASPX que devuelve una imagen - ¿Caché de salida disponible?

He creado un formulario web APSX que devuelve una imagen remota basada en algunos parámetros suministrados. Se puede utilizar la siguiente manera: el marcado y el código

<img src="/ImageGetter.aspx?param1=abc&param2=123" /> 

de ImageGetter.aspx un aspecto similar a este:

<%@ OutputCache Duration="100000" VaryByParam="*" Location="ServerAndClient" %> 
<%@ Page Language="C#" AutoEventWireup="false" EnableSessionState="False" CodeBehind="ImageGetter.aspx.cs" Inherits="ACME.Helpers.ImageGetter" %> 

Este código se llama en el método Page_Load de ImageGetter.aspx:

byte[] data = null; 
Dictionary<string, string> file_locations = GetImageLocations(param1, param2); 
try 
{ 
    data = new WebClient().DownloadData(file_locations["main"]); 
} 
catch (WebException wex) 
{ 
    try 
    { 
     data = new WebClient().DownloadData(file_locations["backup"]); 
    } 
    catch (Exception e) 
    { 
     throw; 
    } 
} 
Response.ContentType = "image/jpeg"; 
Response.OutputStream.Write(data, 0, data.Length); 
Response.End(); 

De mi prueba, no parece estar en caché. ¿Es esto posible con el Caché de resultados o debería recurrir a escribir mi propio caché para almacenar los arrays de bytes en función de los parámetros de cadena de consulta?

Respuesta

10

Pruebe soltar el Response.End() ya que esto terminará el subproceso prematuramente y evitará que ocurra el almacenamiento en caché de salida.

Ver: http://bytes.com/groups/net-asp/323363-cache-varybyparam-doesnt-work

Usted puede deseo de considerar el uso de un controlador ASHX y utilizar su propio método de almacenamiento en caché.

+0

caída Response.End alguna manera se ralentiza aún más. – Bullines

+3

... porque ahora está saltando a través de los aros de caché? – Codebrain

2

Utilice un controlador genérico ASHX y utilice el HttpRuntimeCache (objeto Cache) para hacer el trabajo como dijo Codebrain. Será más rápido y MANERA más flexible.

0

Su problema podría ser un bug in IE - no se puede almacenar en caché si se utiliza el encabezado de respuesta HTTP Vary:*, pero IIS lo devuelve de manera predeterminada porque está en la especificación HTTP 1.1.

Trate de añadir lo siguiente a su web.config:

<system.web> 
    <caching> 
     <outputCache omitVaryStar="true" /> 
    </caching> 
</system.web> 
Cuestiones relacionadas