我構建了一個MVC3應用程序,應用程序有很多頁面,現在因爲安全問題我需要在http頭中添加no-cache設置,Is更簡單的方法來做到這一點?如果我們可以修改一個地方,那麼它將爲整個應用程序工作,這將是完美的。如何添加站點範圍內的no-cache頭到MVC 3應用程序
你們能幫我嗎?
我構建了一個MVC3應用程序,應用程序有很多頁面,現在因爲安全問題我需要在http頭中添加no-cache設置,Is更簡單的方法來做到這一點?如果我們可以修改一個地方,那麼它將爲整個應用程序工作,這將是完美的。如何添加站點範圍內的no-cache頭到MVC 3應用程序
你們能幫我嗎?
如何在Global.asax中設置頭的Application_PreSendRequestHeaders
事件裏面?
編輯 您可以使用Response.Cache.SetCacheability
,而不是直接設置標頭。*
void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
測試的提琴手。通過手動設置集管
替代方式。
void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
Response.Headers.Set("Cache-Control", "no-cache");
}
這太方便了!如果你這樣做,你將不會緩存所有的JavaScript,CSS,圖標等,並在你的帶寬和響應能力上做了很多。 –
@ScottStafford閱讀OP的請求「如果我們可以修改一個地方,那麼它將爲整個應用程序工作,這將是完美的。」顯然,某些文件可以被過濾,但這不是要求的。 – Marko
我知道他說的。我沒有-1或什麼,但我想確保他(和任何其他讀者)知道這種嚴重手段的後果是什麼。拋出一個測試「這是一個aspx文件」,它的適用性更廣泛。 –
我會做在IIS本身(假設你正在使用),或在web.config:
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache" />
</staticContent>
</system.webServer>
</configuration>
更少的代碼是更好的代碼。
根據IIS的版本,設置稍有不同。
有關更多信息,請參閱here。
我建議將這些調用限制爲非GET請求,以避免在GET上丟失緩存的好處。以下內容確保即使是積極的緩存瀏覽器(如iOS 6 Safari)也不會緩存任何不是GET請求的內容。
我使用了一個控制器基類,我的所有控制器都繼承了基於很多原因,這很好,因爲我的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);
...
}
...
}
基於HTTP動詞設置緩存策略對於各種應用程序來說都不足夠。假設您有一個頁面,您可以使用GET和查詢字符串來加載醫院患者數據?您不希望該頁面被緩存。 –
拉里,在那種情況下,你肯定不會想要實現基本控制器邏輯,就像我在這裏所建議的那樣。 :) –
替代爲那些想要方法/操作或類/控制器寬no-cache
[OutputCache(Location = OutputCacheLocation.None)]
public class HomeController : Controller
{
...
}
如所解釋這裏:
OutputCacheLocation Enumeration
無:輸出緩存爲禁用請求的頁面。此值 對應於HttpCacheability.NoCache枚舉值。
NoCache的 - 設置的Cache-Control:no-cache標題....
ASP.NET輸出緩存不同於OP詢問的no-cache HTTP頭。 –
@MikeMarynowski是的,但你確定嗎?我認爲「None」既不是服務器也不是客戶端,並且爲客戶端生成「Cache-Control:no-cache」標頭 – KCD
[「None:\t輸出緩存對於請求的頁面是禁用的,該值對應於HttpCacheability.NoCache枚舉值。「](http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation(v = vs.100).aspx)... [」NoCache - 設置緩存控制: no-cache header ....「](http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v = vs.100).aspx) – KCD
設置全局過濾器。
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);
}
}
我已經編輯我的答案使用'Response.Cache.SetCacheability()'方法,而不是手動設置標頭。在Fiddler測試並按預期工作。 – Marko