ASPX返回图像 - 输出缓存能力?

时间:2009-04-13 21:35:53

标签: c# asp.net caching outputcache

问候!

我创建了一个APSX Web表单,它根据一些提供的参数返回一个远程图像。它可以像这样使用:

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

ImageGetter.aspx的标记和代码与此类似:

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

此代码在ImageGetter.aspx的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();

从我的测试来看,它似乎不是缓存。这可能与输出缓存有关,还是应该根据查询字符串参数编写自己的缓存来存储字节数组?

3 个答案:

答案 0 :(得分:10)

尝试删除Response.End(),因为这会过早终止线程并阻止输出缓存发生。

请参阅:http://bytes.com/groups/net-asp/323363-cache-varybyparam-doesnt-work

可能希望考虑使用ASHX处理程序并使用您自己的缓存方法。

答案 1 :(得分:2)

使用ASHX通用处理程序并使用HttpRuntimeCache(Cache对象)来完成Codebrain所说的工作。它会更快,更灵活。

答案 2 :(得分:0)

您的问题可能是bug in IE - 如果使用Vary:* HTTP响应标头,则无法缓存,但IIS默认返回它,因为它位于HTTP 1.1规范中。

尝试将以下内容添加到您的web.config中:

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