2009-04-13 9 views
5

Pozdrowienia!ASPX, który zwraca obraz - możliwe buforowanie danych wyjściowych?

Utworzono formularz internetowy APSX, który zwraca obraz zdalny na podstawie niektórych dostarczonych parametrów. Może być stosowany tak: adiustacji i kod

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

ImageGetter.aspx wyglądają podobnie do tego:

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

Kod ten jest nazywany w ImageGetter.aspx w metodzie Page_Load:

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(); 

Z moich testów nie wygląda na buforowanie. Czy można to zrobić z buforowaniem wyjściowym, czy też powinienem napisać własną pamięć podręczną, aby przechowywać tablice bajtów w zależności od parametrów ciągów zapytania?

Odpowiedz

10

Spróbuj upuścić metodę Response.End(), ponieważ spowoduje to przedwczesne zakończenie gwintowania i uniemożliwi buforowanie wyjściowe.

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

Ty może chęć rozważyć użycie programu obsługi ashx i stosując własną metodę buforowania.

+0

spada Response.End jakoś spowalnia go jeszcze bardziej. – Bullines

+3

... ponieważ teraz przeskakuje przez obręcze pamięci podręcznej? – Codebrain

2

Użyj ogólnej procedury obsługi ASHX i użyj HttpRuntimeCache (obiektu Cache), aby wykonać zadanie, jak powiedział Codebrain. Będzie szybciej i bardziej elastycznie.

0

Twój problem może być bug in IE - nie może buforować, jeśli używany jest nagłówek odpowiedzi HTTP Vary:*, ale IIS zwraca go domyślnie, ponieważ jest w specyfikacji HTTP 1.1.

spróbuj dodać następujące wpisy do pliku web.config:

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