c# - 在代码中设置 Far Future Expires header - ASP.NET

标签 c# asp.net iis optimization web-optimization

有没有一种方法可以通过 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/

相关文章:

c# - 根据 OData 查询评估单个对象

c# - 如何在c#.net中通过ClientID查找控件?

iis - 如何获取IIS AppPool工作进程ID

c# - 在 C# SOAP 中开始使用 Paypal 自适应支付

c# - ASP.NET - 如何检测 MAC 用户

.net - .NET 中的全局导入/使用别名

wcf - Set-WebConfigurationProperty失败

C#使用SMTP邮件发送邮件

c# - Dropbox OAuth 签名中有什么内容?

c# - 如何使用 ConfigurationCollection 中的键(数组键访问)检索 ConfigurationElement?