有没有一种方法可以使用 ASP.NET 以编程方式在代码中设置 Expires 标头?具体来说,我需要在整个文件夹和所有子文件夹上设置它,并且该文件夹仅包含静态文件(JavaScript、CSS、图像等)而不包含 aspx 文件,所以我不能只在 aspx 代码中添加一些代码-page_load 后面。
我通常可以直接在 IIS 中设置它。但是服务器被客户端锁定(我只能通过 FTP 访问 Web 应用程序目录以进行部署),并且让客户端在 IIS 上设置 Expires 标头需要一个冰河时代(它是一个公共部门/政府站点)。
根据雅虎的建议,我这样做是出于前端优化的原因http://developer.yahoo.com/performance/rules.html#expires
更新:我试过创建一个 HttpModule ......
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
}
}
}
虽然这看起来行不通。我在代码上放置了一个断点,它可以正常运行。但是,当我在 Firefox 中分析原始 HTTP 标头信息时,没有设置 expires 值。请注意,我正在使用 BeginRequest,但我也尝试过连接 PostReleaseRequestState 和 PreSendRequestHeaders,但它们似乎也不起作用。有任何想法吗?
更新 2:好的,因为我正在运行 IIS6,HttpModules 不会运行静态文件,只能运行动态文件(*.aspx 等)。感谢 RickNZ 的帮助,我想出了以下 IHttpModule:
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.0 * 3.0));
}
}
}
...而且它似乎有效,但仅在 Visual Studio 的内置 Web 服务器和 IIS7 中(在集成管道模式下)。一位工作同事提到在 IIS6 上设置通配符映射以让 HttpModules 处理静态文件,但如果我可以访问 IIS6,我可以直接设置 Far-Future Expires 标头,而不用打扰这个 HttpModule。那好吧!