public void ProcessRequest(HttpContext context) { IBinary binary = null; string url = context.Request.Path; Cache cache = HttpContext.Current.Cache; if (cache[url] != null) { binary = (IBinary)cache[url]; } else { binary = BinaryFactory.FindBinary(context.Request.Path); int cacheSetting = Convert.ToInt32(ConfigurationManager.AppSettings[BinaryHandlerCachingKey]); cache.Insert(url, binary, null, DateTime.Now.AddSeconds(cacheSetting), TimeSpan.Zero); } string etagDate = "\"" + binary.LastPublishedDate.ToString("s", DateTimeFormatInfo.InvariantInfo) + "\""; string incomingEtag = context.Request.Headers["If-None-Match"]; context.Response.Cache.SetETag(etagDate); context.Response.Cache.SetCacheability(HttpCacheability.Public); if (etagDate.Equals(incomingEtag)) { context.Response.StatusCode = 304; return; } var localPath = ConvertUrl(context.Request.Path, context); if (binary == null) { // there appears to be no binary present in Tridion // now we must check if there is still an (old) cached copy on the local file system object fileLock = LockFile(binary.Url); lock (fileLock) { RemoveFromDB(binary); lock (locks) { locks.Remove(binary.Url); } } // that's all for us, the file is not on the FS, so // the default FileHandler will cause a 404 exception context.Response.StatusCode = 404; context.Response.End(); return; } using (var db = new BinariesEntities()) { bool exists = false; var binData = db.Binaries.Where(bin => bin.ComponentUri == binary.Id).FirstOrDefault(); TimeSpan ts = TimeSpan.Zero; if (binData != null) { ts = binary.LastPublishedDate.Subtract(binData.LastPublishedDate); exists = true; } if (!exists || ts.TotalMilliseconds > 0) { WriteToDb(binary); } } FillResponse(context.Response, binary); }
private void RemoveFromDB(IBinary binary) { using (var db = new BinariesEntities()) { var binData = db.Binaries .Where<Binaries>(bin => bin.Path.Equals(binary.Url)).FirstOrDefault(); if (binData != null) { db.Binaries.Remove(binData); db.SaveChanges(); } } }
private void WriteToDb(IBinary binary) { object fileLock = LockFile(binary.Url); using (var db = new BinariesEntities()) { lock (fileLock) { var binData = db.Binaries .Where(bin => bin.ComponentUri == binary.Id).FirstOrDefault(); if (binData == null) { binData = new Binaries(); db.Binaries.Add(binData); } binData.ComponentUri = binary.Id; binData.Path = binary.Url; binData.LastPublishedDate = binary.LastPublishedDate; binData.Content = binary.BinaryData; db.SaveChanges(); } } }
private void FillResponse(HttpResponse response, IBinary binary) { response.Clear(); byte[] imageData = null; using (var db = new BinariesEntities()) { var binData = db.Binaries.Where(bin => bin.ComponentUri == binary.Id).FirstOrDefault(); if (binData != null) { imageData = binData.Content; response.ContentType = GetContentType(binData.Path); response.Cache.SetLastModified(binData.LastPublishedDate); } } response.BinaryWrite(imageData); }