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);
            }
        }
Example #4
0
        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);
            });
        }