2011-09-15 38 views
9

我正在开发一个应用程序,该应用程序在Facebook应用程序上呈现公司的Twitter供稿。这是一家大型公司,有很多流量到FB应用程序,因此我需要缓存我收到的Twitter数据(来自twitter API),以便我可以避免它们的费率限制。在C#中缓存JSON数据MVC3

在我的代码中,我使用LinqToTwitter来调用API,然后构造一个带有结果的JSON字符串。该字符串然后通过AJAX馈送给用户的浏览器。

Twitter API调用的速率限制为每小时150次,所以我想我只是将我构建的JSON数据字符串放在缓存对象中,并且每分钟只刷新一次,使我远低于Twitter速率限制。

问题是,我相当新的MVC为.NET,似乎无法使用System.Web.Caching就像我可以做一个webforms应用程序。

在旧的WebForms应用程序,我只是不喜欢的东西:

  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]; 
      } 

有人能告诉我如何在MVC3做到这一点?

谢谢!

马特

回答

17

在ASP.NET MVC 3,如果你希望缓存控制器操作的结果,你可以用[OutputCache]属性装饰它:

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

如果你不想缓存控制器动作的整个输出,你可以使用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,这将工作与位置设置为客户端而不是服务器?我的意思是,在客户端而不是服务器上缓存json结果? – AdrianoRR

+0

达林,很好的回答!我只想知道是否可以使来自特定控制器的缓存[OutputCache]无效。 – GibboK

1

使用HttpContext.Cache在控制器

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]; 
}