질문하기질문하기
 

답변됨cache problem

  • 2009년 11월 7일 토요일 오전 11:36sanjay pal 사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     

    hi,

    I am using the fileuplaod control to upload the images. For this I used to stored it in the cache

    for 2 hours in byte format and show this image using the HttpContext in the .ashx file. For some Reason it

    is sometime saving in the cache and sometime not. I am using asp.net 2.0 and C# language.

     

    My code For Saving :

    //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);

     

    Code For Rendering Image using .ashx file:

     

    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);

     

    }

     

    Is there any Problem In saving the byte image in cache Or any other better way of doing this?. I dont want to save image bye on the disk.

    Thanks!

답변

  • 2009년 11월 8일 일요일 오후 11:01ccbristo 사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     답변됨코드 있음
    I am not certain of this (and haven't been able to confirm with MSDN documentation), but I don't think that cache items are guaranteed to live until their expiration, they are only guaranteed not to live longer than their expiration.  If these images are large, it may not take many of them to cause the cache to flush the older items.  You could try to diagnose this by logging when items are removed from the cache similarly to this:

    Cache.Add(string.Format("{0}_Type", strGuid), strContentType, null,  DateTime.Now.AddDays(2), Cache.NoSlidingExpiration, CacheItemPriority.Normal, HandleCacheItemRemoved);
    
    void HandleCacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
    {
       // possible concurrency issues here if you are sending multiple simultaneous requests
       using(StreamWriter sw = File.AppendText("C:\LogFile.txt"))
       {
         sw.WriteLine("Cache item ({0}) was removed. Reason: ({1}).", key, reason);
      }
    }
    
    Hopefully that will provide you with some more information.
    • 편집됨ccbristo 2009년 11월 8일 일요일 오후 11:03reformatting code
    • 답변으로 표시됨eryangMSFT, 중재자2009년 11월 16일 월요일 오전 3:27
    •  

모든 응답

  • 2009년 11월 8일 일요일 오후 11:01ccbristo 사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     답변됨코드 있음
    I am not certain of this (and haven't been able to confirm with MSDN documentation), but I don't think that cache items are guaranteed to live until their expiration, they are only guaranteed not to live longer than their expiration.  If these images are large, it may not take many of them to cause the cache to flush the older items.  You could try to diagnose this by logging when items are removed from the cache similarly to this:

    Cache.Add(string.Format("{0}_Type", strGuid), strContentType, null,  DateTime.Now.AddDays(2), Cache.NoSlidingExpiration, CacheItemPriority.Normal, HandleCacheItemRemoved);
    
    void HandleCacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
    {
       // possible concurrency issues here if you are sending multiple simultaneous requests
       using(StreamWriter sw = File.AppendText("C:\LogFile.txt"))
       {
         sw.WriteLine("Cache item ({0}) was removed. Reason: ({1}).", key, reason);
      }
    }
    
    Hopefully that will provide you with some more information.
    • 편집됨ccbristo 2009년 11월 8일 일요일 오후 11:03reformatting code
    • 답변으로 표시됨eryangMSFT, 중재자2009년 11월 16일 월요일 오전 3:27
    •