处理ASP.Net MVC中的过期标题

时间:2010-12-29 10:29:38

标签: asp.net

我需要有关如何在ASP.Net MVC中为我的CSS,图像和JavaScript文件添加过期标题的建议或建议。

关键问题是软件不在一个位置。它分发给处理托管的客户,所以我宁愿有一个不需要在IIS中手动配置的解决方案,除非它是不可避免的!

我用Google搜索,大多数答案似乎都集中在通过控制器返回的内容上。虽然不能为JavaScript文件做到这一点。

3 个答案:

答案 0 :(得分:5)

您使用的是哪个IIS版本?

如果通过“手动IIS配置”意味着必须打开IIS管理器控制台,IIS 7.5(我认为也是7)允许您仅使用web.config将expires标头添加到静态内容:

<system.webServer>
  <staticContent>
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:30:00" />
  </staticContent>
</system.webServer>

答案 1 :(得分:3)

您可以通过为javascript文件编写自定义处理程序来执行此类操作。在MVC项目的Web.Config文件中,查找httpHandlers部分。添加如下行:

<add verb="GET" path="/YourScriptsFolder/*.js" type="Your.Project.Namespace.And.Custom.Handler, Your.Assembly.Name" validate="false" />

这将强制通过您的自定义处理程序对该文件夹中的js文件的所有请求,如下所示:

class CustomHandler : IHttpHandler 
{

    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        // Set any headers you like here.
        context.Response.Expires = 0; 
        context.Response.Cache.SetExpires(DateTime.Parse("3:00:00PM")); 
        context.Response.CacheControl="no-cache"; 

        // Determine the script file being requested.
        string path = context.Request.ServerVariables["PATH_INFO"];
        // Prevent the user from requesting other types of files through this handler.
        if(System.Text.RegularExpressions.RegEx.Match(path, @"/YourScriptsFolder/[^/\\\.]*\.js"))
            context.Response.Write(System.IO.File.ReadAllText(path));
    }

    #endregion
}

我没有测试过这段代码,所以你可能遇到一些问题,但这是基本的想法。整个网络上有很多关于ASP.Net自定义处理程序的例子。这是一个很好的例子:

http://www.developer.com/net/asp/article.php/3565541/Use-Custom-HTTP-Handlers-in-Your-ASPNET-Applications.htm

答案 2 :(得分:0)

另一个不那么复杂的选项是在文件路径的末尾添加一个随机或版本化的查询字符串。

<link rel="stylesheet" type="text/css" href="somecssfile.css?version=1.0.0.3" />

当您更改版本时,浏览器将获得该文件的新副本。