2009-11-07 3 views
1

Я использую элемент управления fileuplaod для загрузки изображений. Для этого я использовал для хранения его в кешепроблема кеша в asp.net с C#

в течение 2 часов в байтовом формате и показывать это изображение с использованием HttpContext в файле .ashx. Для некоторых причин

- это некоторая экономия в кеше, а иногда и нет. Я использую 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); 
} 

Есть ли проблема в сохранении байт изображения в кэше или любой другой лучший способ сделать это?

Спасибо! sanjay pal

ответ

4

Элементы, помещенные в кеш, не гарантируются там. В некоторых ситуациях инфраструктура может истекать из кэша, например, если она начинает работать с низким объемом памяти. В этом случае он вызовет onRemoveCallback, который вы передадите, когда вы добавите элемент в кэш.

Кэш не является надежным хранилищем, вы должны всегда проверять, есть ли элемент перед его использованием, и если он не выполняет необходимые действия для его получения и не помещает его туда, чтобы будущие вызывающие могли его найти.

1

Вы можете указать CacheItemPriority.NotRemovable вместо CacheItemPriority.Normal, чтобы предотвратить его удаление из кэша до истечения срока его действия.

Но более традиционный подход заключается в том, чтобы разрешить его удалять и повторно заполнять кеш, если вы обнаружите, что он отсутствует.