2009-04-13 9 views
5

Chúc mừng!ASPX Trả về một hình ảnh - đầu ra Cache-có thể?

Tôi đã tạo biểu mẫu web APSX trả về hình ảnh từ xa dựa trên một số thông số được cung cấp. Nó có thể được sử dụng như thế này: đánh dấu và mã

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

ImageGetter.aspx nhìn tương tự như sau:

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

Mã này được gọi là trong phương pháp Page_Load ImageGetter.aspx của:

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

Từ thử nghiệm của tôi, nó không xuất hiện để được bộ nhớ đệm. Điều này có thể làm với đầu ra Caching hoặc tôi nên nghỉ mát để viết bộ nhớ cache của riêng tôi để lưu trữ các mảng byte tùy thuộc vào paramters chuỗi truy vấn?

Trả lời

10

Hãy thử bỏ Response.End() vì thao tác này sẽ chấm dứt luồng sớm và ngăn không cho lưu vào bộ đệm đầu ra.

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

Bạn thể mong muốn xem xét sử dụng một handler ASHX và sử dụng phương pháp bộ nhớ đệm của riêng bạn.

+0

rơi Response.End nào đó làm chậm nó xuống thậm chí nhiều hơn như vậy. – Bullines

+3

... bởi vì bây giờ nó nhảy qua hoops cache? – Codebrain

2

Sử dụng trình xử lý chung ASHX và sử dụng HttpRuntimeCache (đối tượng Cache) để thực hiện công việc như Codebrain đã nói. Nó sẽ nhanh hơn và WAY linh hoạt hơn.

0

Sự cố của bạn có thể là bug in IE - nó không thể cache nếu tiêu đề phản hồi HTTP Vary:* được sử dụng, nhưng IIS trả về theo mặc định vì nó nằm trong thông số HTTP 1.1.

thử thêm sau để web.config của bạn:

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