2012-01-28 2 views
1

현재 특정 폴더에 GWT 웹 응용 프로그램을 호스팅하기 위해 Web.config를 통해 ASP.net 웹 응용 프로그램을 구성하려고합니다. 그러나 system.Webserver/staticContent 섹션에서 .manifest 파일 확장명에 대한 mimeMap을 구성 할 수 있었지만 clientCache가 붙어 있습니다. 캐싱 규칙을 추가하여 ".nocache"가 포함 된 파일을 만들고 싶습니다.IIS에서 GWT Webapp 호스팅

"Expires", "Sat, 21 Jan 2012 12:12:02 GMT" (today -1); 
"Pragma", "no-cache" 
"Cache-control", "no-cache, no-store, must-revalidate" 

누구나 IIS 7 이상에서이를 수행하는 방법을 알고 있습니까?

답변

1

파일 타임 스탬프가 자동으로 IIS에 체크하고 브라우저는 항상 타임 스탬프를 기반으로 업데이트 된 파일에 대해 서버, 그래서 .nocache를 요청합니다. 파일은 IIS에서 특별한 것을 필요로하지 않습니다.

그러나 브라우저에서 .cache를 캐시하려는 경우. 파일이면 다음 HttpModule은 .cache.js 또는 .cache.html (또는 임의의 확장자)로 끝나는 파일의 경우 캐시 만료일을 30 일로 설정합니다. 브라우저는 이러한 파일의 업데이트 된 버전을 요청하지 않습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace CacheModulePlayground 
{ 
    public class CacheModule : IHttpModule 
    { 
     private HttpApplication _context; 


     public void Init(HttpApplication context) 
     { 
      _context = context; 
      context.PreSendRequestHeaders += context_PreSendRequestHeaders; 
     } 

     void context_PreSendRequestHeaders(object sender, EventArgs e) 
     { 

      if (_context.Response.StatusCode == 200 || _context.Response.StatusCode == 304) 
      { 
       var path = _context.Request.Path; 

       var dotPos = path.LastIndexOf('.'); 
       if (dotPos > 5) 
       { 
        var preExt = path.Substring(dotPos - 6, 7); 
        if (preExt == ".cache.") 
        { 
         _context.Response.Cache.SetExpires(DateTime.UtcNow.Add(TimeSpan.FromDays(30))); 
        } 
       } 

      } 

     } 


     public void Dispose() 
     { 
      _context = null; 
     } 
    } 
} 

이의 Web.config은 다음과 같습니다

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.5" /> 
     <httpRuntime targetFramework="4.5" /> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <add name="cacheExtension" type="CacheModulePlayground.CacheModule"/> 
    </modules> 
    </system.webServer> 
</configuration> 
+0

GWT Perfect Caching for Apache server web.config. 디버깅에서'SetExpires'가 실행된다는 것을 알 수 있습니다. Firefox는 먼 미래의 날짜로 응답 헤더에 "Expires"를 표시합니다. Firefox가 여전히 html 파일을 캐싱하지 않는 이유는 무엇입니까? – slartidan

+0

추신 : 내 잘못 : 캐싱을 테스트하기 위해 "다시로드"를 사용하지만 "다시로드"는 캐시를 사용하지 않습니다. 이제 당신의 솔루션은 나를 위해 완벽하게 작동합니다. 감사. – slartidan

0
  1. using System; 
    using System.Web; 
    using System.Text.RegularExpressions; 
    
    namespace YourNamespace 
    { 
        /// <summary> 
        /// Classe GwtCacheHttpModuleImpl 
        /// 
        /// Permet de mettre en cache pour un an ou pas du tout les fichiers générés par GWT 
        /// </summary> 
        public class GwtCacheHttpModuleImpl : IHttpModule 
        { 
    
         private HttpApplication _context; 
    
         private static String GWT_FILE_EXTENSIONS_REGEX_STRING = "\\.(js|html|png|bmp|jpg|gif|htm|css|ttf|svg|woff|txt)$"; 
    
         private static Regex GWT_CACHE_OR_NO_CACHE_FILE_REGEX = new Regex(".*\\.(no|)cache" + GWT_FILE_EXTENSIONS_REGEX_STRING); 
         private static Regex GWT_CACHE_FILE_REGEX = new Regex(".*\\.cache" + GWT_FILE_EXTENSIONS_REGEX_STRING); 
    
         #region IHttpModule Membres 
    
         public void Dispose() 
         { 
          _context = null; 
         } 
    
         public void Init(HttpApplication context) 
         { 
          context.PreSendRequestHeaders += context_PreSendRequestHeaders; 
          _context = context; 
         } 
    
         #endregion 
    
         private void context_PreSendRequestHeaders(object sender, EventArgs e) 
         { 
          int responseStatusCode = _context.Response.StatusCode; 
    
          switch (responseStatusCode) 
          { 
           case 200: 
           case 304: 
            // Réponse gérée 
            break; 
           default: 
            // Réponse non gérée 
            return; 
          } /* end..switch */ 
    
    
          String requestPath = _context.Request.Path; 
    
          if (!GWT_CACHE_OR_NO_CACHE_FILE_REGEX.IsMatch(requestPath)) 
          { 
           // Fichier non géré 
           return; 
          } 
    
          HttpCachePolicy cachePolicy = _context.Response.Cache; 
    
          if (GWT_CACHE_FILE_REGEX.IsMatch(requestPath)) 
          { 
           // Fichier à mettre en cache 
           cachePolicy.SetExpires(DateTime.UtcNow.Add(TimeSpan.FromDays(365))); /* now plus 1 year */    
          } 
          else 
          { 
           // Fichier à ne pas mettre en cache 
           cachePolicy.SetExpires(DateTime.UtcNow); /* ExpiresDefault "now" */ 
           cachePolicy.SetMaxAge(TimeSpan.Zero); /* max-age=0 */ 
           cachePolicy.SetCacheability(HttpCacheability.Public); /* Cache-Control public */ 
           cachePolicy.SetRevalidation(HttpCacheRevalidation.AllCaches); /* must-revalidate */ 
          } 
    
         } 
        } 
    } 
    
  2. 참조하여 HTTP 모듈을 파일 GwtCacheHttpModuleImpl.cs에 HTTP 모듈 클래스 만들기 Web.Config의 ILE :

당신은 IIS UI (IIS 5.x 및 통해 응용 프로그램을 구성해야 ISAPI 모듈을 통해 GWT 파일 확장자를 처리합니다. 내 경우에는 NET 3.5). 당신은 ... PNG, CSS, 같은

A) 핸들 확장명은 .js

실행 파일을 다른 GWT 파일 확장명을 추가 할 수 있습니다 C를 : \ WINDOWS \ microsoft.net \ 프레임 워크 \ V2.0.50727 \를 aspnet_isapi.dll을

확장 : 의 .js

제한에 : GET, HEAD

b) 핸들.HTML 확장

실행 : C : \ WINDOWS \ microsoft.net 프레임 워크 \ \ V2.0.50727 \ aspnet_isapi.dll을

확장 : .html 중에서

제한에 : GET, HEAD

참조 : I 코드를 첨가하고, 변경 사항을 적용

관련 문제