Пример #1
0
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "image/JPEG";

            int    size       = int.Parse(context.Request["size"]);
            string gravatarID = context.Request["gravatar_id"];

            if (size != 16 && size != 50 && size != 80)
            {
                throw new ArgumentException("The size must be either 16, 50 or 80");
            }

            string gravatarFileName          = String.Format("{0}_{1}.jpg", gravatarID, size);
            string cachedGravatarFolderPath  = Path.Combine(context.Request.PhysicalApplicationPath, @"Static\Images\Cache\Gravatars\");
            string defaultGravatarFolderPath = Path.Combine(context.Request.PhysicalApplicationPath, @"Static\Images\Cache\DefaultGravatars\");
            string cachedGravatarFilePath    = Path.Combine(cachedGravatarFolderPath, gravatarFileName);
            string gravatarCopyPath          = cachedGravatarFilePath.Replace(".jpg", ".copy.jpg");

            string gravatarToReturnPath = cachedGravatarFilePath;

            if (File.Exists(gravatarToReturnPath) && (File.GetLastWriteTime(gravatarToReturnPath).AddMinutes(GRAVATAR_CACHE_DURATION_IN_MINUTES) < DateTime.Now))
            {
                if (!File.Exists(gravatarCopyPath) && new FileInfo(cachedGravatarFilePath).Length > 0)
                {
                    File.Copy(cachedGravatarFilePath, gravatarCopyPath, true); //create a copy for tempory serving
                }
                try {
                    File.Delete(cachedGravatarFilePath);
                } catch (System.IO.IOException) { }

                gravatarToReturnPath = gravatarCopyPath;
            }

            if (File.Exists(gravatarToReturnPath))
            {
                context.Response.Cache.SetExpires(DateTime.Now.AddHours(24));
                context.Response.Cache.SetValidUntilExpires(true);
                context.Response.Cache.SetCacheability(HttpCacheability.Public);
            }
            else
            {
                if (File.Exists(gravatarCopyPath))
                {
                    gravatarToReturnPath = gravatarCopyPath;
                }
                else
                {
                    gravatarToReturnPath = Path.Combine(defaultGravatarFolderPath, String.Format("gravatar_{0}.jpg", size));
                }

                //Asynchronously download the gravatars to the cache
                GravatarHelper.DownloadGravatar_Begin(gravatarID, size, cachedGravatarFilePath);
            }

            try {
                context.Response.WriteFile(gravatarToReturnPath);
            } catch (System.IO.IOException) { //The file may be locked
                try {
                    context.Response.WriteFile(gravatarCopyPath);
                } catch (System.IO.IOException) {
                    context.Response.WriteFile(Path.Combine(defaultGravatarFolderPath, String.Format("gravatar_{0}.jpg", size)));
                }
            }
        }