2011-08-17 50 views
19

我構建了一個MVC3應用程序,應用程序有很多頁面,現在因爲安全問題我需要在http頭中添加no-cache設置,Is更簡單的方法來做到這一點?如果我們可以修改一個地方,那麼它將爲整個應用程序工作,這將是完美的。如何添加站點範圍內的no-cache頭到MVC 3應用程序

你們能幫我嗎?

+0

我已經編輯我的答案使用'Response.Cache.SetCacheability()'方法,而不是手動設置標頭。在Fiddler測試並按預期工作。 – Marko

回答

29

如何在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"); 
} 
+11

這太方便了!如果你這樣做,你將不會緩存所有的JavaScript,CSS,圖標等,並在你的帶寬和響應能力上做了很多。 –

+0

@ScottStafford閱讀OP的請求「如果我們可以修改一個地方,那麼它將爲整個應用程序工作,這將是完美的。」顯然,某些文件可以被過濾,但這不是要求的。 – Marko

+3

我知道他說的。我沒有-1或什麼,但我想確保他(和任何其他讀者)知道這種嚴重手段的後果是什麼。拋出一個測試「這是一個aspx文件」,它的適用性更廣泛。 –

1

我會做在IIS本身(假設你正在使用),或在web.config:

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

更少的代碼是更好的代碼。

根據IIS的版本,設置稍有不同。

有關更多信息,請參閱here

+0

該配置是否僅適用於靜態內容(img,js,css等),還是名稱只是有點誤導?從IIS網站不太清楚。 –

+0

@Troy - 我*想*這是一切。很容易測試,只需檢查fiddler/firebug/etc中的響應標頭 – RPM1984

+2

從應用程序控制緩存似乎更適合我,因爲我期望大多數人都希望緩存靜態內容。另外,我不會說你的解決方案需要更少的代碼:-)。 – theDmi

1

我建議將這些調用限制爲非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); 
     ... 
    } 
... 
} 
+0

基於HTTP動詞設置緩存策略對於各種應用程序來說都不足夠。假設您有一個頁面,您可以使用GET和查詢字符串來加載醫院患者數據?您不希望該頁面被緩存。 –

+0

拉里,在那種情況下,你肯定不會想要實現基本控制器邏輯,就像我在這裏所建議的那樣。 :) –

13

替代爲那些想要方法/操作或類/控制器寬no-cache

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

如所解釋這裏:

OutputCacheLocation Enumeration

無:輸出緩存爲禁用請求的頁面。此值 對應於HttpCacheability.NoCache枚舉值。

HttpCacheability Enumeration

NoCache的 - 設置的Cache-Control:no-cache標題....

+0

ASP.NET輸出緩存不同於OP詢問的no-cache HTTP頭。 –

+0

@MikeMarynowski是的,但你確定嗎?我認爲「None」既不是服務器也不是客戶端,並且爲客戶端生成「Cache-Control:no-cache」標頭 – KCD

+0

[「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

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

相關問題