1

現在、特定のフォルダーで GWT WebApp をホストするために、Web.config を使用して ASP.net Web アプリケーションを構成しようとしています。system.Webserver/staticContent セクションで .manifest ファイル拡張子の mimeMap を構成することができましたが、clientCache に行き詰まっています。「.nocache.」を含むファイルがキャッシュされるように、キャッシュ ルールを追加したいと考えています。次のヘッダーで提供されます。

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

IIS 7+ 内でこれを行う方法を知っている人はいますか?

4

3 に答える 3

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>
于 2013-03-17T15:36:33.243 に答える
0
  1. GwtCacheHttpModuleImpl.cs ファイルに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. Web.Config ファイルでHTTP モジュールを参照します。

  3. ISAPI モジュールを介して GWT ファイルの拡張子を処理する

IIS UI(私の場合はIIS 5.xおよび.NET 3.5)を介してアプリケーションを構成する必要があります。png、css などの他の GWT ファイル拡張子を追加できます。

a) .js 拡張子を処理する

実行可能ファイル: c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

拡張子:.js

限定: GET、HEAD

b) .html 拡張子の処理

実行可能ファイル: c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

拡張子: .html

限定: GET、HEAD

参考:GWT Perfect Caching for Apache サーバー

于 2014-07-25T13:22:32.070 に答える
0

最終的に、パス .nocache へのすべてのリクエストを処理するカスタム httphandler を作成しましたここで説明されているものと同様のソリューションを使用します。

スクリプトがプログラムによってキャッシュされないようにする

于 2012-01-30T13:15:52.850 に答える