如何将站点范围的无缓存标头添加到MVC 3应用程序

时间:2011-08-17 04:14:52

标签: c# asp.net-mvc asp.net-mvc-3

我构建了一个MVC3应用程序,应用程序有很多页面,现在因为我需要在http标头中添加无缓存设置的安全问题,是否有更简单的方法呢?如果我们可以修改一个地方然后它将适用于整个应用程序,它将是完美的。

你们可以帮助我吗?

5 个答案:

答案 0 :(得分:31)

如何在 Global.asax 中的Application_PreSendRequestHeaders事件中设置标题

修改 您可以使用Response.Cache.SetCacheability而不是直接设置标题。*

void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

在Fiddler中测试过。


通过手动设置标题的替代方式。

void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
    Response.Headers.Set("Cache-Control", "no-cache");
}

答案 1 :(得分:14)

替代那些想要方法/动作或类/控制器范围no-cache

的人
[OutputCache(Location = OutputCacheLocation.None)]
public class HomeController : Controller
{
...
}

如下所述:

OutputCacheLocation Enumeration

  

无:已为请求的页面禁用输出缓存。这个值   对应于HttpCacheability.NoCache枚举值。

HttpCacheability Enumeration

  

NoCache - 设置Cache-Control:no-cache header ....

答案 2 :(得分:2)

设置全局过滤器。

public class MvcApplication : System.Web.HttpApplication
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new NoCacheGlobalActionFilter());
    }    
}

public class NoCacheGlobalActionFilter : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(HttpCacheability.NoCache);

        base.OnResultExecuted(filterContext);
    }
}

http://dotnet.dzone.com/articles/output-caching-aspnet-mvc

答案 3 :(得分:1)

我会在IIS本身(假设您正在使用它)或web.config:

中执行此操作
<configuration>
   <system.webServer>
      <staticContent>
         <clientCache cacheControlMode="DisableCache" />
      </staticContent>
   </system.webServer>
</configuration>

更少的代码是更好的代码。

根据IIS的版本,设置略有不同。

有关详细信息,请参阅here

答案 4 :(得分:1)

我建议将这些调用限制为非GET请求,以避免在GET上失去缓存的好处。以下内容确保即使是像iOS 6 Safari这样的积极缓存浏览器也不会缓存任何非GET请求的内容。

我使用所有控制器继承的Controller基类有很多原因,这很好用,因为我的Initialize覆盖可以有条件地设置我的缓存头。

public class SmartController : Controller
{
    ...
    public HttpContextBase Context { get; set; }

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        Context = requestContext.HttpContext;

        if (Context.Request.RequestType != "GET")
        {
            Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }

        base.Initialize(requestContext);
        ...
    }
...
}