2009-11-03 3 views
4

Im, создающее изображение, в котором есть текст, для каждого клиента изображение содержит свое имя, и я использую функцию Graphics.DrawString для создания этого на лету, однако мне не нужно создайте это изображение несколько раз, просто потому, что имя клиента вряд ли изменится, но я не хочу его хранить на диске.Кэширование http-обработчика .ashx output

Теперь я создаю изображение в обработчик т.е.:

<asp:Image ID="Image1" runat="server" ImageUrl="~/imagehandler.ashx?contactid=1" /> 

Что является лучшим способом для кэширования образа, который приходит обратно? Должен ли я кэшировать растровое изображение, которое он создает? Или кешируйте поток, который я передаю? И какой объект кеша я должен использовать, я понимаю, что существует много разных способов? Но выходное кэширование не работает на обработчиках HTTP? Каков рекомендуемый способ? (Я не беспокоюсь о кешировании на стороне клиента, я на стороне сервера) Спасибо!

+0

Можете ли вы предоставить дополнительную информацию re: вид нагрузки, которую вы ожидаете? и насколько велик объем кэшированных данных – Basic

ответ

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; 
} 
+0

Это очень сработало для меня. Изображения, которые я хотел кэшировать, были масштабированными версиями файла на диске. Если файл базового изображения изменился, я хотел бы аннулировать кеш для изображений на его основе. Я обнаружил, что добавив изображение в кеш с зависимостью от файла, все работает отлично: context.Cache.Insert (cacheKey, bmp, new System.Web.Caching.CacheDependency (imageFileName)) // где «imageFileName» указывалось на исходный файл – RobbieCanuck

+0

Было бы гораздо лучше сохранить Bitmap в MemoryStream и кеш, а не ... .1/10-го использования памяти и намного лучшую производительность. Кодирование экземпляра Bitmap для потока - это большая часть использования ЦП в любом случае - кеширование Bitmap не оптимизирует узкое место. @Robbie, если вы масштабируете изображения, посмотрите на http://imageresizing.net/, кэширование диска - это путь. –

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

//try out with – a simple handler which returns the current time 

HttpContext.Current.Response.ContentType = "text/plain"; 
HttpContext.Current.Response.Write("Hello World " + DateTime.Now.ToString("HH:mm:ss")); 
+5

Это похоже на кеширование браузера, а не на кеширование вывода. –

+1

Еще очень полезный фрагмент кода – jvenema