2009-04-13 9 views
5

Saluti!ASPX che restituisce un'immagine - Output Cache-capable?

Ho creato un modulo Web APSX che restituisce un'immagine remota in base ad alcuni parametri forniti. Può essere utilizzato in questo modo: markup e codice

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

di ImageGetter.aspx simile al seguente:

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

Questo codice è chiamato nel metodo Page_Load di 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(); 

Dai miei test, non sembra essere il caching. È possibile farlo con Output Caching o dovrei ricorrere alla scrittura della mia cache per archiviare gli array di byte in base ai parametri della stringa di query?

risposta

10

Provare a eliminare Response.End() poiché ciò interromperà il thread prematuramente e impedirà l'esecuzione della cache di output.

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

È può desiderio di considerare l'utilizzo di un gestore ASHX e utilizzando il proprio metodo di caching.

+0

Dropping Response.End rallenta qualche giù ancora di più. – Bullines

+3

... perché ora sta saltando attraverso i cerchi della cache? – Codebrain

2

Utilizzare un gestore generico ASHX e utilizzare HttpRuntimeCache (oggetto Cache) per eseguire il lavoro come indicato da Codebrain. Sarà più veloce e più flessibile.

0

Il tuo problema potrebbe essere un bug in IE - non può memorizzare nella cache se viene utilizzata l'intestazione di risposta HTTP Vary:*, ma IIS lo restituisce per impostazione predefinita perché è nelle specifiche HTTP 1.1.

Prova ad aggiungere quanto segue al web.config:

<system.web> 
    <caching> 
     <outputCache omitVaryStar="true" /> 
    </caching> 
</system.web> 
Problemi correlati