使用c#在asp.net中缓存问题

时间:2009-11-07 13:23:09

标签: c# asp.net httpcontext httpcontext.cache

我正在使用fileuplaod控件上传图片。为此,我曾经将它存储在缓存中

以字节格式显示2小时,并使用.ashx文件中的HttpContext显示此图像。出于某种原因,

有时会在缓存中保存,有时则不会。我使用的是asp.net 2.0和C#语言。

我的保存代码:

//Name of the Image 
string strGuid = Guid.NewGuid().ToString(); 
byte[] byteImage = new byte[ImageUpload.PostedFile.ContentLength];

//file upload control ID "ImageUpload" and read it and save it in cache.
ImageUpload.PostedFile.InputStream.Read(byteImage, 0, byteImage.Length);

//Saving Byte in the cache
Cache.Add(strGuid, byteImage, null, DateTime.Now.AddDays(2), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

//Saving Image Format in cache
Cache.Add(string.Format("{0}_Type", strGuid), strContentType, null, DateTime.Now.AddDays(2), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
UserImage.ImageUrl = string.Format("~/UserControl/ImageHander.ashx?imgId={0}", strGuid);

使用.ashx文件渲染图像的代码:

public void ProcessRequest (HttpContext context) 
{
    string strImageGuid = context.Request.QueryString["imgId"].ToString();
    string strContentTypeID = string.Format("{0}_Type",  context.Request.QueryString["imgId"].ToString());
    byte[] byteImage =(byte []) context.Cache[strImageGuid];
    string strContentType = (string)context.Cache[strContentTypeID];
    context.Response.ContentType = strContentType;
    context.Response.OutputStream.Write(byteImage, 0, byteImage.Length);
}

在缓存中保存字节图像还是有任何其他更好的方法吗?

谢谢! 桑杰帕尔

2 个答案:

答案 0 :(得分:4)

不保证在那里找到放入缓存的项目。在某些情况下,框架可能会使缓存中的项目失效,例如,如果它开始在内存中运行不足。在这种情况下,当您将项目添加到缓存时,它将调用您传递的onRemoveCallback

缓存不是一个可靠的存储空间,您需要在使用之前始终检查该项目是否存在,以及是否未执行必要的操作来获取它并将其放回那里以便将来的调用者可以找到它。 / p>

答案 1 :(得分:1)

您可以指定CacheItemPriority.NotRemovable而不是CacheItemPriority.Normal,以防止在其到期之前将其从缓存中删除。

但更常规的方法是允许删除它,如果发现它丢失,则重新填充缓存。