缓存http处理程序.ashx输出

4
我正在创建一张图片,其中包含一些文本,对于每个客户,该图片都包含他们的姓名,我使用Graphics.DrawString函数动态创建此图片。然而,由于客户的姓名几乎不会改变,因此我不需要多次创建此图片,但我也不想将其存储在磁盘上。现在,我正在处理程序中创建这张图片,例如:
<asp:Image ID="Image1" runat="server" ImageUrl="~/imagehandler.ashx?contactid=1" />

最佳的缓存图片方式是什么?我应该缓存它创建的位图还是传回来的流?还有哪个缓存对象应该使用,因为我了解到有许多不同的方式?但是输出缓存在 http 处理程序上不起作用,对吗?推荐的方式是什么?(我不关心客户端缓存,我关心的是服务器端)谢谢!


你能提供更多关于你所期望的负载类型以及缓存数据大小的信息吗? - Basic
2个回答

5
我能想到的最简单的解决方案是,在图像处理程序中创建Bitmap对象后,将其缓存到HttpContext.Cache中。
private Bitmap GetContactImage(int contactId, HttpContext context)
{
    string cacheKey = "ContactImage#" + contactId;
    Bitmap bmp = context.Cache[cacheKey];

    if (bmp == null)
    {
         // generate your bmp
         context.Cache[cacheKey] = bmp;
    }

    return bmp;
}

这对我非常有效。我想要缓存的图像是磁盘上文件的缩放版本。如果基础图像文件发生更改,我希望使基于它的图像缓存失效。我发现通过将图像添加到具有文件依赖项的缓存中,一切都完美地解决了:context.Cache.Insert(cacheKey,bmp,new System.Web.Caching.CacheDependency(imageFileName)) //其中“imageFileName”指向原始文件 - RobbieCanuck
最好将Bitmap保存到MemoryStream中并缓存,这样会减少1/10的内存使用量,并且性能更好。将Bitmap实例编码到流中是大部分CPU使用率 - 缓存Bitmap不是优化瓶颈。如果您正在缩放图像,请查看http://imageresizing.net/,磁盘缓存是正确的选择。 - Lilith River

1

大卫,

你可以在处理程序上使用输出缓存,但不是声明式地,在代码后面。 看看你是否可以使用以下片段。

TimeSpan refresh = new TimeSpan(0, 0, 15);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.Add(refresh));
HttpContext.Current.Response.Cache.SetMaxAge(refresh);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Server);
HttpContext.Current.Response.Cache.SetValidUntilExpires(true);
//尝试一下 - 返回当前时间的简单处理程序
HttpContext.Current.Response.ContentType = "text/plain"; HttpContext.Current.Response.Write("Hello World " + DateTime.Now.ToString("HH:mm:ss"));

5
这似乎是浏览器缓存,而不是输出缓存。 - William Gross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接