在 IIS 中托管 GWT Web 应用程序

发布于 2024-12-29 09:12:03 字数 386 浏览 2 评论 0原文

我当前正在尝试通过 Web.config 配置 ASP.net Web 应用程序,以在特定文件夹中托管 GWT WebApp。我已经设法在 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+ 中执行此操作?

I am currently trying to configure an ASP.net Web Application through Web.config, to host a GWT WebApp in a specific folder. I've managed to configure the mimeMap for the .manifest file extension in the system.Webserver/staticContent section however, i'm stuck with the clientCache. I want to add a caching rule so that files with ".nocache." are served with the following headers:

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

Anyone knows how to do this within IIS 7+ ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

猫瑾少女 2025-01-05 09:12:04

IIS 中会自动检查文件时间戳,浏览器始终根据时间戳向服务器请求更新的文件,因此 .nocache。文件在 IIS 中不需要任何特殊的东西。

但是,如果您希望浏览器缓存 .cache。对于以 .cache.js 或 .cache.html(或任何扩展名)结尾的文件,以下 HttpModule 将缓存过期日期设置为从现在起 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>

The file time stamp is automatically checked in IIS and the browser always requests the server for updated file based on the timestamp, so the .nocache. files don't need anything special in IIS.

However if you wanted the browser to cache the .cache. files then the following HttpModule sets the cache expiration date to 30 days from now for files that end in .cache.js or .cache.html (or any extension). The browser won't even request for updated versions of these files.

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;
        }
    }
}

The web.config for this is:

<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>
猫卆 2025-01-05 09:12:04

我最终创建了一个自定义 httphandler 来处理对路径 .nocache. 的所有请求,使用类似于此处描述的解决方案:

防止脚本以编程方式缓存

I ended up creating a custom httphandler to handle all the requests to the path .nocache. using a solution similar to the one described in here:

Prevent scripts from being cached programmatically

戴着白色围巾的女孩 2025-01-05 09:12:04
  1. 在 GwtCacheHttpModuleImpl.cs 文件中创建 HTTP 模块类

    使用系统;
    使用系统.Web;
    使用 System.Text.RegularExpressions;
    
    命名空间 你的命名空间
    {
        /// <摘要>
        /// 类 GwtCacheHttpModuleImpl
        /// 
        /// Permet de metre en Cache pour un an ou pas du les fichiers générés par GWT
        /// 
        公共类 GwtCacheHttpModuleImpl :IHttpModule
        {
    
            私有 HttpApplication _context;
    
            私有静态字符串 GWT_FILE_EXTENSIONS_REGEX_STRING = "\\.(js|html|png|bmp|jpg|gif|htm|css|ttf|svg|woff|txt)$";
    
            私有静态正则表达式 GWT_CACHE_OR_NO_CACHE_FILE_REGEX = new Regex(".*\\.(no|)cache" + GWT_FILE_EXTENSIONS_REGEX_STRING);
            私有静态正则表达式 GWT_CACHE_FILE_REGEX = new Regex(".*\\.cache" + GWT_FILE_EXTENSIONS_REGEX_STRING);
    
            #region IHttpModule 成员
    
            公共无效处置()
            {
                _上下文=空;
            }
    
            公共无效初始化(HttpApplication上下文)
            {
                context.PreSendRequestHeaders += context_PreSendRequestHeaders;
                _context = 上下文;
            }
    
            #endregion
    
            私人无效context_PreSendRequestHeaders(对象发送者,EventArgs e)
            {
                int responseStatusCode = _context.Response.StatusCode;
    
                开关(响应状态代码)
                {
                    案例200:
                    案例304:
                        // 回复 gérée
                        休息;
                    默认:
                        // 回复非 gérée
                        返回;
                } /* 结束..切换 */
    
    
                字符串 requestPath = _context.Request.Path;
    
                if (!GWT_CACHE_OR_NO_CACHE_FILE_REGEX.IsMatch(requestPath))
                {
                    // Fichier non géré
                    返回;
                }
    
                HttpCachePolicy cachePolicy = _context.Response.Cache;
    
                if (GWT_CACHE_FILE_REGEX.IsMatch(requestPath))
                {
                    // 缓存数据
                    cachePolicy.SetExpires(DateTime.UtcNow.Add(TimeSpan.FromDays(365))); /* 现在加上 1 年 */              
                }
                别的
                {
                    // 缓存中的文件
                    cachePolicy.SetExpires(DateTime.UtcNow); /* 过期默认“现在” */
                    cachePolicy.SetMaxAge(TimeSpan.Zero); /* 最大年龄=0 */
                    cachePolicy.SetCacheability(HttpCacheability.Public); /* 缓存控制公共 */
                    cachePolicy.SetRevalidation(HttpCacheRevalidation.AllCaches); /* 必须重新验证 */
                }
    
            }
        }
    }
    
  2. 在 Web.Config 文件中引用您的 HTTP 模块

  3. 通过 ISAPI 模块处理 GWT 文件扩展

您应该通过 IIS UI(IIS 5.x 和 . NET 3.5(在我的例子中)。
您可以添加其他 GWT 文件扩展名,例如 png、css...

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 Apache 服务器完美缓存

  1. Create an HTTP module class in GwtCacheHttpModuleImpl.cs file

    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. Reference your HTTP module in Web.Config file :

  3. Handle GWT file extention via ISAPI module

You should configure your application via IIS UI ( IIS 5.x and .NET 3.5 in my case ).
You could add other GWT file extensions like png, css, ...

a) Handle .js extension

Executable : c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

Extension : .js

Limit to : GET,HEAD

b) Handle .html extension

Executable : c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

Extension : .html

Limit to : GET,HEAD

Reference : GWT Perfect Caching for Apache server

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文