/// <summary> /// Header에 ContentType, Cache 설정을 수행합니다. /// </summary> /// <param name="context"></param> /// <param name="filename"></param> private static void SetRepsonseHeaders(HttpContext context, string filename) { context.Response.Clear(); context.Response.ContentType = WebTool.GetMime(filename); context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime().AddYears(1)); context.Response.Cache.SetMaxAge(new TimeSpan(365, 0, 0, 0)); // NOTE : HTTPS 에서 동작하기 위해 context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); context.Response.Cache.SetCacheability(HttpCacheability.Public); }
/// <summary> /// HttpHandler의 작업의 메인 메소드입니다. 재정의 하여 원하는 기능을 수행하되, 제일 첫번째에 부모 클래스의 메소들를 호출해주어야 합니다. /// </summary> /// <param name="context"></param> protected override void DoProcessRequest(HttpContext context) { base.DoProcessRequest(context); if (IsDebugEnabled) { log.Debug("정적 파일 (Static File) 요청 처리를 시작합니다..."); } ParseRequestParams(context); // file not found!!! var physicalPath = context.Server.MapPath(WebTool.GetScriptPath(_virtualPath)); if (physicalPath.FileExists() == false) { ResponseFileNotFound(context, _virtualPath); // context.Response.End(); return; } // if requested file already exist in cache, send file from cache // if (WriteFromCache(context, _cacheKey, CacheDuration, CompressionKind) == false) { _contentType = WebTool.GetMime(physicalPath); var readTask = ReadFile(context, physicalPath); _isCompressed = CanCompression; var fileExt = physicalPath.ExtractFileExt(); // 이미지 파일이거나, 압축이 필요없는 파일은 압축하지 않습니다. if (_contentType.Contains("image") || WebTool.NoCompressionFileExtensions.Any(fileExt.Contains)) { if (IsDebugEnabled) { log.Debug("이미지 파일등 이미 압축된 상태의 파일은 압축하지 않습니다.... physicalFile=[{0}]", physicalPath); } _isCompressed = false; } byte[] readBytes = readTask.Result; if (_isCompressed && readBytes.Length < CompressionThreshold) { if (IsDebugEnabled) { log.Debug("전송할 데이타의 크기가 기본 Threadhold [{0}] bytes 보다 작아 압축을 하지 않습니다. Content-Length=[{1}] bytes", CompressionThreshold, readBytes.Length); } _isCompressed = false; } // 결론적으로 압축이 필요하다면 압축을 합니다. // if (_isCompressed) { readBytes = Compressor.Compress(readBytes); } var cacheItem = new CacheItem(readBytes, _isCompressed, _contentType); SaveToCache(context, _cacheKey, cacheItem, CacheDuration); WriteBytes(context, cacheItem, CacheDuration, CompressionKind); } // context.Response.End(); if (IsDebugEnabled) { log.Debug("정적 파일 (Static File) 요청 처리를 완료했습니다!!! file=[{0}]", _virtualPath); } }