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

本文关键字:缓存 MVC 应用程序 范围内 何添加 添加 站点 | 更新日期: 2023-09-27 18:05:43

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

你们能帮帮我吗?

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

如何在Global.asaxApplication_PreSendRequestHeaders事件中设置Headers ?

编辑您可以使用Response.Cache.SetCacheability而不是直接设置header。*

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


另一种手动设置header的方法

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

方法/动作或类/控制器宽no-cache

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

如下所示:

OutputCacheLocation枚举

None:关闭请求页面的输出缓存。这个值对应于httpacheability。NoCache枚举值。

HttpCacheability枚举

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

设置全局过滤器。

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

我会在IIS中做(假设你正在使用它),或者web.config:

<configuration>
   <system.webServer>
      <staticContent>
         <clientCache cacheControlMode="DisableCache" />
      </staticContent>
   </system.webServer>
</configuration>

代码越少越好。

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

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

我使用一个Controller基类,我所有的控制器都继承它,这有很多原因,这很好地服务于我的Initialize override可以有条件地处理设置我的缓存头。

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);
        ...
    }
...
}