Проблема кеша в asp.net с C#
Я использую элемент управления fileuplaod для загрузки изображений. Для этого я использовал его в кеше
в течение 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);
}
Есть ли проблема с сохранением байтового изображения в кеше или каким-либо другим лучшим способом сделать это?
Спасибо! санджай приятель
2 ответа
Элементы, помещенные в кеш, не гарантированно находятся там. В некоторых ситуациях структура может истекать элементы из кэша, например, если она начинает исчерпывать память. В этом случае он вызовет onRemoveCallback, который вы передаете, когда добавляете элемент в кеш.
Кэш-память не является надежным хранилищем, необходимо всегда проверять, есть ли там элемент, прежде чем его использовать, и если он не выполняет необходимые действия для его извлечения и помещения обратно, чтобы его могли найти будущие абоненты.
Вы можете указать CacheItemPriority.NotRemovable вместо CacheItemPriority.Normal, чтобы предотвратить его удаление из кэша до истечения срока его действия.
Но более традиционный подход - разрешить его удаление и заполнить кеш, если вы обнаружите, что он отсутствует.