2014-12-04 11 views
9

Qual è il modo corretto di utilizzare il seguente in un'applicazione vNext su un metodo asincrono:Come si applica l'attributo OutputCache su un metodo in un progetto vNext?

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 

vedo che è parte di System.Web.Caching, ma l'unico posto dove ho potuto aggiungere che sarebbe in la sezione aspnet50 -> frameworkAssemblies del mio file project.json, che non è corretta.

risposta

7

Aggiornamento
Come AndersNS era una sorta di sottolineare, sarà disponibile in RC1 più probabile: https://github.com/aspnet/Mvc/issues/536.

Per dirla semplicemente non c'è OutputCache o equivalente in ASP.NET 5 attualmente.

Tuttavia, si noti che OutputCache è solo un attributo con logica minima che comunica con un provider di cache. Ad esempio, puoi facilmente implementare il tuo attribute, usando Memory Cache. Oppure puoi usare soluzioni di terze parti.

Sono sicuro che quando sarà disponibile il ASP.NET 5 ci saranno molte soluzioni sul mercato. E sono abbastanza sicuro che avremo anche un equivalente ufficiale OutputCache.

Ecco il base MemoryCache utilizzo in caso qualcuno lo trova utile

MemoryCache cache = MemoryCache.Default; 
string cacheName = "MyCache"; 

if (cache.Contains(cacheName) == false || cache[cacheName] == null) 
{ 
    var data = ... get data 

    cache.Set(cacheName, data, new CacheItemPolicy() { SlidingExpiration = DateTime.Now.AddDays(1).TimeOfDay }); 
} 

return cache[cacheName]; 
+2

https://github.com/aspnet/Mvc/issues/536 Vedere anche la discussione in questo numero, dovrebbe essere in per RC1 di mvc6 – AndersNS

+2

Grazie per le informazioni! Terrò fuori gli occhi per questo in RC1. –

+3

Mentre stiamo parlando è stato progettato e lavorato: D – davidfowl

21

ASP.NET core 1.1/2.0 Risposta

Aggiungere la risposta caching middleware in questo modo:

public void Configure(IApplicationBuilder application) 
{ 
    application 
     .UseResponseCaching() 
     .UseMvc(); 
} 

Questo middleware memorizza il contenuto della cache in base alle intestazioni HTTP di caching impostate nella risposta. Puoi dare un'occhiata al resto della risposta per vedere come usare ResponseCache.

ASP.NET 1.0 Nucleo risposta

Utilizzare la nuova ResponseCache attributo invece. ResponseCache non è una sostituzione diretta di OutputCache poiché controlla solo il caching del client e del proxy utilizzando l'intestazione HTTP Cache-Control.

Se si desidera utilizzare la cache lato server, vedere la domanda StackOverflow this che illustra come utilizzare IMemoryCache o IDistributedCache.

// Add this to your controller action. 
[ResponseCache(Duration = 3600)] 

Ecco un esempio utilizzando i nuovi profili di cache:

// Add this to your controller action. 
[ResponseCache(CacheProfile="Cache1Hour")] 

// Add this in Startup.cs 
services.AddMvc(options => 
{ 
    options.CacheProfiles.Add(
     new CacheProfile() 
     { 
      Name = "Cache1Hour", 
      Duration = 3600, 
      VaryByHeader = "Accept" 
     }); 
}); 

trucchi

La risposta caching middleware smette di funzionare in una varietà di situazioni che si può imparare di più su nel docs. Due comuni che probabilmente colpiranno sono che smette di funzionare se vede un'intestazione HTTP Authorization o Set-Cookie.

Bonus Commento

In ASP.NET 4.6, che potrebbe rappresentare profili di cache nel web.config e modifica le impostazioni senza ricompilare il codice. Per ulteriori informazioni su come è possibile spostare i profili di cache sul nuovo config.json, piuttosto che codificarlo con hard in Startup.cs vedere la domanda this.

+0

Sei sicuro che questo è uguale a OutputCache? ResponseCache sembra interessare le intestazioni HTTP, ma in realtà non memorizza nulla sul lato server –

+1

Lo fa se si utilizza il middleware 'UseResponseCaching()'. Detto questo, ci sono alcune restrizioni su di esso al momento. Uno è che arresta il caching quando vede un'intestazione HTTP 'Authorization'. Maggiori informazioni nei documenti ASP.NET. –