在C#MVC3中缓存JSON数据

时间:2011-09-15 07:48:20

标签: c# .net asp.net-mvc-3 caching twitter

我正在开发一个应用程序,它在Facebook应用程序上显示公司的Twitter提要。这是一家拥有大量流量的FB公司,所以我需要缓存我收到的Twitter数据(来自twitter API),以便我可以避免他们的速率限制。

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

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

问题是我对MVC for .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中完成此任务吗?

谢谢!

马特

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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];
}