问题
Greetings!
I've created an APSX web form that returns a remote image based on some supplied parameters. It can be used like this:
<img src="/ImageGetter.aspx?param1=abc¶m2=123" />
ImageGetter.aspx's markup and code look similar to this:
<%@ OutputCache Duration="100000" VaryByParam="*" Location="ServerAndClient" %>
<%@ Page Language="C#" AutoEventWireup="false" EnableSessionState="False" CodeBehind="ImageGetter.aspx.cs" Inherits="ACME.Helpers.ImageGetter" %>
This code is called in ImageGetter.aspx's Page_Load method:
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();
From my testing, it doesn't appear to be caching. Is this possible to do with Output Caching or should I resort to writing my own cache to store the byte arrays depending on query string paramters?
回答1:
Try dropping the Response.End() as this will terminate the thread prematurely and prevent output caching from taking place.
See: http://bytes.com/groups/net-asp/323363-cache-varybyparam-doesnt-work
You may wish to consider using an ASHX handler and using your own caching method.
回答2:
Use an ASHX generic handler and use the HttpRuntimeCache (Cache object) to do the job as Codebrain said. It will be faster and WAY more flexible.
回答3:
Your problem could be a bug in IE - it can't cache if the Vary:*
HTTP response header is used, but IIS returns it by default because it's in the HTTP 1.1 spec.
Try adding the following to your web.config:
<system.web>
<caching>
<outputCache omitVaryStar="true" />
</caching>
</system.web>
来源:https://stackoverflow.com/questions/745500/aspx-that-returns-an-image-output-cache-able