Кэширование данных JSON в C # MVC3 - PullRequest
9 голосов
/ 15 сентября 2011

Я занимаюсь разработкой приложения, которое представляет канал Twitter компании в приложении Facebook. Это крупная компания с большим объемом трафика для приложения FB, поэтому мне нужно кэшировать данные Twitter, которые я получаю (из Twitter API), чтобы я мог избежать ограничения их скорости.

В моем коде я использую LinqToTwitter для вызова API, а затем создаю строку JSON с результатами. Эта строка затем подается в браузер пользователя через AJAX.

Ограничение скорости вызовов API Twitter составляет 150 в час, поэтому я полагаю, что я просто помещу строку данных JSON, которую я создаю, в объект кэша и обновляю ее только раз в минуту, оставляя меня значительно ниже предела скорости Twitter.

Проблема в том, что я довольно новичок в MVC для .NET и, похоже, не могу использовать 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?

Спасибо!

Мэтт

Ответы [ 2 ]

17 голосов
/ 15 сентября 2011

В 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 голос
/ 15 сентября 2011

Используйте 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...