2012-01-28 8 views
1

現在、特定のフォルダにGWT WebAppをホストするために、Web.configを使用してASP.net Webアプリケーションを構成しようとしています。私は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は遠い将来の日付としてResponseヘッダに "Expires"を表示します。 Firefoxがまだhtmlファイルをキャッシュしていない理由はありますか? – slartidan

+0

PS:私のせいで、キャッシングをテストするのに "リロード"を使っていますが、 "リロード"はキャッシュを使用しません。今あなたのソリューションは私にとって完璧に機能します。ありがとう。 – slartidan

0
  1. あなたのHTTPモジュールを参照

    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. ファイルGwtCacheHttpModuleImpl.csでHTTPモジュールクラスを作成します。 Web.Configの ILE:ISAPIモジュールを介して

  3. GWTファイル拡張子をハンドル

あなたはIIS UIを介して、アプリケーションを構成する必要があります(IIS 5.xおよび。私の場合は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コードを追加し、変更を適用

関連する問題