2011-09-15 16 views
9

Sto sviluppando un'applicazione che presenta il feed Twitter di un'azienda su un'applicazione Facebook. Questa è una grande azienda con molto traffico all'app FB, quindi ho bisogno di memorizzare nella cache i dati di Twitter che ricevo (dall'API di Twitter) in modo da evitare i limiti di velocità.Memorizzazione nella cache dei dati JSON in C# MVC3

Nel mio codice, utilizzo LinqToTwitter per chiamare l'API e quindi costruisco una stringa di JSON con i risultati. Tale stringa viene quindi inviata al browser dell'utente tramite AJAX.

Il limite di velocità per le chiamate API Twitter è 150 all'ora, quindi immagino che inserirò la stringa di dati JSON che costruisco in un oggetto cache e la aggiornerò solo una volta al minuto lasciandomi ben al di sotto del limite di frequenza di Twitter.

Il problema è che sono abbastanza nuovo in MVC per .NET e non riesco a utilizzare System.Web.Caching come se potessi fare in un'applicazione Webforms.

In più anziani WebForms applicazioni che semplicemente fatto qualcosa di simile:

  private string KeyTwitterData; 

      ... 

      string data = null; 
      if (Cache[KeyTwitterData] == null) 
      { 
       var url = LinqToTwitter.Request.Url; 
       data = ServiceMethods.GetConversation(url); 
       Cache.Insert(KeyTwitterData, data); 
      } 
      else 
      { 
       data = (string)Cache[KeyTwitterData]; 
      } 

qualcuno può dirmi come ottenere questo risultato in MVC3?

Grazie!

Matt

risposta

17

In ASP.NET MVC 3, se si desidera memorizzare nella cache il risultato di un'azione di controllo si potrebbe decorare con l'attributo [OutputCache]:

[OutputCache(Duration = 3600, Location = OutputCacheLocation.Server, VaryByParam = "none")] 
public ActionResult Foo() 
{ 
    var model = SomeExpensiveOperationToFetchData(); 
    return View(model); 
} 

Se non si desidera memorizzare nella cache l'intera produzione di un'azione di controllo è possibile utilizzare la classe MemoryCache:

var data = MemoryCache.Default[KeyTwitterData]; 
if (data == null) 
{ 
    data = SomeExpensiveOperationToFetchData(); 
    MemoryCache.Default.Add(KeyTwitterData, data, DateTime.Now.AddMinutes(5)); 
} 

// use the data variable here 
+0

@Darin, questo funzionerebbe con Posizione impostata su client anziché su server? Voglio dire, memorizzando il risultato JSON sul client invece che sul server? – AdrianoRR

+0

Darin, ottima risposta! Vorrei solo sapere se sarebbe possibile invalidare la cache [OutputCache] da un controller specifico. – GibboK

1

Uso HttpContext.Cache nel controller

string data = null; 
if (HttpContext.Cache[KeyTwitterData] == null) 
{ 
    var url = LinqToTwitter.Request.Url; 
    data = ServiceMethods.GetConversation(url); 
    HttpContext.Cache.Insert(KeyTwitterData, data); 
} 
else 
{ 
    data = (string)HttpContext.Cache[KeyTwitterData]; 
} 
Problemi correlati