我构建了一个MVC3应用程序,应用程序有很多页面,现在因为我需要在http标头中添加无缓存设置的安全问题,是否有更简单的方法呢?如果我们可以修改一个地方然后它将适用于整个应用程序,它将是完美的。
你们可以帮助我吗?
答案 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枚举值。
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);
}
}
答案 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);
...
}
...
}