【问题标题】:Caching JSON Data in C# MVC3在 C# MVC3 中缓存 JSON 数据
【发布时间】:2011-11-17 15:41:40
【问题描述】:

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

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

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

问题是我对 MVC for .NET 还很陌生,似乎无法像在 webforms 应用程序中那样使用 System.Web.Caching。

在旧的网络表单应用程序中,我只是做了类似的事情:

            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 中实现这一点吗?

谢谢!

马特

【问题讨论】:

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


    【解决方案1】:

    在 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
    

    【讨论】:

    • @Darin,这可以将 Location 设置为客户端而不是服务器吗?我的意思是,在客户端而不是服务器上缓存 json 结果?
    • 达林,很好的答案!我只是想知道是否可以使特定控制器的缓存 [OutputCache] 无效。
    【解决方案2】:

    在你的控制器中使用 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];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2014-07-14
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多