public HttpResponseMessage CategoryImage(int id, [FromUri] ImageParam param) { if (param == null) { throw new ArgumentNullException("param"); } HttpResponseMessage message = new HttpResponseMessage(); object[] args = new object[5]; args[0] = id; args[1] = param.h; args[2] = param.w; args[3] = param.Mode; bool?showDefault = param.ShowDefault; args[4] = showDefault.HasValue ? ((object)showDefault.GetValueOrDefault()) : ((object)1); string key = string.Format("categoryImage[id:{0}][w:{1}][h:{2}][m:{3}][d:{4}]", args); ImageCacheItem item = null; if ((item == null) || Settings.IsCacheDisabled) { Image categoryImage = ExcursionProvider.GetCategoryImage(id); if ((categoryImage == null) && (!(showDefault = param.ShowDefault).GetValueOrDefault() && showDefault.HasValue)) { message.StatusCode = HttpStatusCode.NotFound; } else { ImageFormatter formatter = new ImageFormatter(categoryImage, Pictures.nophoto) { Format = (categoryImage != null) ? ImageFormat.Jpeg : ImageFormat.Png }; param.ApplyFormat(formatter); Stream stream = formatter.CreateStream(); if (stream != null) { item = ImageCacheItem.Create(stream, formatter.MediaType); HttpContext.Current.Cache.Add(key, item, null, DateTime.Now.AddMinutes(10.0), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); message.Content = new StreamContent(stream); message.Content.Headers.ContentType = new MediaTypeHeaderValue(formatter.MediaType); message.Headers.CacheControl = new CacheControlHeaderValue(); message.Headers.CacheControl.Public = true; message.Headers.CacheControl.MaxAge = new TimeSpan?(TimeSpan.FromHours(1.0)); } else { message.StatusCode = HttpStatusCode.NotFound; } } } else { message.Content = new StreamContent(item.CraeteStream()); message.Content.Headers.ContentType = new MediaTypeHeaderValue(item.MediaType); } message.Headers.CacheControl = new CacheControlHeaderValue(); message.Headers.CacheControl.Public = true; message.Headers.CacheControl.MaxAge = new TimeSpan?(TimeSpan.FromHours(1.0)); return(message); }
void AddImage(ImageCacheItem newItem, AvatarAccess.GetAvatarResult result, Action<AvatarAccess.GetAvatarResult> onComplete) { ImageCacheItem item; if (result.Data != null && !string.IsNullOrEmpty(newItem.UserName)) { lock (_cacheLock) { if(!_cache.TryGetValue(newItem, out item)) { newItem.Data = result.Data; newItem.Time = DateTime.UtcNow; _cache.Add (newItem, newItem); } else { item.Data = result.Data; item.Time = DateTime.UtcNow; } } } if (onComplete != null) onComplete (result); }
/// <summary> /// Retrieves image as byte array by its id. /// </summary> /// <param name="id">The ID of the media library element.</param> /// <param name="imageId">The ID of the image.</param> /// <returns></returns> public async Task <byte[]> GetImage(string id, string imageId, ImageTypeEnum imageType) { if (string.IsNullOrEmpty(id)) { return(null); } if (string.IsNullOrEmpty(imageId)) { return(null); } ImageCacheItem cacheItem = new ImageCacheItem { Id = imageId, ImageType = imageType.ToString(), MediaElementId = id }; if (isCacheEnabled) { ImageCacheItem retrievedItem = await _localCacheService.Get <ImageCacheItem>(cacheItem.GetFileName()); if (retrievedItem != null) { return(retrievedItem.Image); } } string imageEndpoint = string.Format(GetImageEndpoint, id, imageType, imageId); using (HttpClient cli = new HttpClient()) { cli.AddAuthorizationHeaders(); HttpResponseMessage result = await cli.GetAsync(imageEndpoint); byte[] retrievedImage = await result.Content.ReadAsByteArrayAsync(); if (isCacheEnabled) { cacheItem.Image = retrievedImage; #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed _localCacheService.Set(cacheItem.GetFileName(), cacheItem); #pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed } return(retrievedImage); } }
private static Task SetCacheAsync(string cacheKey, byte[] buffer, DateTime expiration) { var imageCacheItem = new ImageCacheItem { Buffer = buffer, Expiration = expiration }; var cacheItemPolicy = new CacheItemPolicy { AbsoluteExpiration = expiration }; return(Task.Run(() => Cache.Set(cacheKey, imageCacheItem, cacheItemPolicy))); }
public byte[] FindOrLoad(User user, int size, Action<AvatarAccess.GetAvatarResult> onComplete) { ImageCacheItem item; ImageCacheItem newItem = new ImageCacheItem { UserName = user.UserName, Size = size}; if (!string.IsNullOrEmpty(user.UserName)) { lock (_cacheLock) { if(_cache.TryGetValue(newItem, out item)) { if (item.Time > (DateTime.UtcNow - _timeSpan)) return item.Data; } } } return Engine.Instance.AvatarAccess.GetAvararForUser (user, size, (result) => { AddImage (newItem, result, onComplete); }); }