在IIS中托管GWT Web应用程序
我目前正在尝试通过Web.config配置ASP.net Web应用程序,以将GWT WebApp托管在特定文件夹中。我设法在system.Webserver/staticContent部分为.manifest文件扩展名配置mimeMap,但是我坚持使用clientCache。我想添加一个缓存规则,以便使用“.nocache”文件。与下列标头一起提供:在IIS中托管GWT Web应用程序
"Expires", "Sat, 21 Jan 2012 12:12:02 GMT" (today -1);
"Pragma", "no-cache"
"Cache-control", "no-cache, no-store, must-revalidate"
任何人都知道如何在IIS 7+中执行此操作?
我最终创建了一个自定义的httphandler来处理对路径.nocache的所有请求。使用类似于在这里所描述的一个解决方案:
文件时间戳在IIS自动检查和浏览器总是要求基于时间戳更新的文件服务器,所以.nocache。在IIS中不需要任何特殊的文件。
但是,如果您希望浏览器缓存.cache。文件,那么以下HttpModule会将缓存过期日期设置为从现在开始的30天内以.cache.js或.cache.html(或任何扩展名)结尾的文件。浏览器甚至不会要求更新这些文件的版本。
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>
-
在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 */ } } } }
-
参考您的HTTP模块在Web.Config中的 f ILE:
通过ISAPI模块句柄GWT文件扩展
您应该配置通过IIS UI(IIS 5.x和您的应用程序。 NET 3.5在我的情况)。 您可以添加其他GWT文件扩展名像PNG,CSS,...
一)手柄.js扩展
可执行文件: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
我添加的代码和所应用的改变web.config。在调试中,我可以看到,执行了“SetExpires”。 Firefox在响应头文件中显示“Expires”作为远期日期。你有什么想法,为什么Firefox仍然没有缓存HTML文件? – slartidan 2015-02-03 11:14:23
PS:我的错:我使用“重新加载”来测试缓存,但“重新加载”从不使用缓存。现在您的解决方案适合我。谢谢。 – slartidan 2015-02-03 11:21:06