2017-02-07 24 views
2

我想告訴ASP.NET Core將常見的Cache-Control和相關頭添加到由MVC控制器提供的所有響應,包括HTML頁面和Web API響應。我不希望該策略應用於緩存靜態文件;那些我想要被緩存的。將瀏覽器緩存策略應用於所有ASP.NET Core MVC頁面

在特定的情況下,我要禁用緩存,應用該屬性的所有控制器的當量:

[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] 

我可以與此屬性製成的基礎控制器和從它派生的所有其他控制器。我想知道是否有一種基於配置的方法可以避免使用這種基礎控制器。

+1

在你的情況下使用中間件是否可行? – DOMZE

+0

如果它能完成這項工作,我很樂意使用中間件。我希望它能夠很好地與MVC緩存控制功能配合使用。例如,我希望有這樣的靈活性,如果將來我想在給定的MVC頁面上覆蓋緩存,我仍然可以在相應的控制器方法上使用「ResponseCache」屬性,並且它會優先。 –

+0

http://davidpine.net/blog/asp-net-core-optimization/ –

回答

1

正如@DOMZE所說,你可以考慮使用自定義中間件。實際上,response caching已經作爲中間件實現。

但是,由於您只想將緩存添加到所有MVC操作,更好的方法是使用MVC action filters。其中一個好處是,你可以申請過濾器只對特定的控制器/行動+你將有機會獲得ActionExecutingContext(控制器實例/動作參數)

public class ResponseCacheActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     // before the action executes 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     // after the action executes 
     // add here a common Cache-Control and related headers to all responses 
    } 
} 
+0

您是否必須將過濾器應用於每個控制器?如果是這樣,我沒有看到使用「ResponseCache」屬性的優勢。 –

+0

@EdwardBrey你可以將過濾器註冊爲全局過濾器 – Set

+0

自己插入頭部的限制是,如果你想保留使用MVC'ResponseCache'屬性來覆蓋某些頁面的默認緩存策略的靈活性,你必須編寫代碼你自己的協調。 –

4

你可以做到這一點W/O中間件只是通過增加

services.AddMvc(options => { 
    options.Filters.Add(new ResponseCacheAttribute() { NoStore = true, Location = ResponseCacheLocation.None }); 
}) 

您的ConfigureServices方法。適用於任何屬性(即AuthorizeAttribute),可以實例化並應用於所有控制器和操作。也不需要基類。

+1

您是否可以將自定義屬性應用於單獨的控制器和方法,以覆蓋「配置服務」設置(如果需要)? –