有没有一种方法可以通过 ASP.NET 在代码中以编程方式设置过期 header ?具体来说,我需要在整个文件夹和所有子文件夹上设置它,并且该文件夹只包含静态文件(JavaScript、CSS、图像等)而不包含 aspx 文件,所以我不能只向 aspx 代码添加一些代码-在 page_load 之后。
我通常可以直接在 IIS 中设置它。但是服务器被客户端锁定(我只有 FTP 访问 Web 应用程序目录以进行部署),让客户端在 IIS 上设置 Expires Header 需要一个冰河时代(这是一个公共(public)部门/政府网站)。
我根据雅虎的建议出于前端优化的原因这样做 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 header 信息时,未设置过期值。请注意,我正在使用 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 header ,而不必理会此 HttpModule。好吧!
最佳答案
如果您使用的是 IIS 7,最简单的方法是编写一个在集成模式下为静态文件运行的 HttpModule,并从那里设置 Expires 和 Cache-Control header 。
更新:
你的 HttpModule 应该可以工作,虽然我通常也会调用:
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.));
更新 2:
使用 IIS 6,您必须以编程方式修改配置数据库。这是可能的,尽管它需要更高的权限。
唯一的其他选择是用 C++ 编写 ISAPI 模块。
关于c# - 在代码中设置 Far Future Expires header - ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1927770/