2015-10-22 3 views
0

Я показываю таблицу на основе запроса из базы данных. Запрос ajax используется для получения данных из таблицы, сериализации в json и с использованием библиотеки JavaScript-данных datatables на передней панели, данные обновляются.Кэширование в MVC .NET

У меня есть требование, чтобы иметь возможность выводить эту таблицу в Excel. Это должно быть в очень специфическом формате, для которого я написал класс и т. Д. Для C#, который правильно работает. У меня также есть контроллер, который затем передаст поток, чтобы пользователь мог загрузить файл.

Мой вопрос связан с кэшированием данных из базы данных. Я не хочу возвращаться в базу данных и повторно запускать запрос, а затем передавать моему экспектору exporter отчет, он должен быть каким-то образом сохранен - ​​последний отчет, который пользователь выполнил.

Есть два способа я могу думать делать это:

1) кэширования клиента - хранить последний отчет, которым управляет пользователем и тогда экспортер первенствует использовать последние данные отчета из кэша.

2) отправьте обратно последний ответ json от вызова Ajax и десериализуйте контроллер обратно в объект отчета.

Номер один кажется наиболее логичным, поскольку два кажутся беспорядочными и склонными к ошибке. Я хотел бы знать, если это лучшее решение, и если бы не предложение о том, какой метод будет лучше.

+0

Я бы начал с [OutputCacheAttribute] (http://stackoverflow.com/a/342761/2030565) в действии вашего контроллера. – Jasen

+0

@ Jasen Спасибо, я все еще немного смущен этим. Этот метод кэширования, похоже, просто кэширует конкретный контроллер, но я не очень забочусь об этом контроллере, потому что он вызван через ajax и возвращает JSON. Я хочу, чтобы объект, возвращенный базой данных и службой (список объекта отчета), находился в кеше, что все еще возможно? –

+0

Он будет кэшировать результат действия. Поэтому последующие запросы не попадают в базу данных до истечения срока действия кэша или являются недействительными. Если ваш код C# написан для использования результата объекта, то OutputCache может оказаться неприемлемым. – Jasen

ответ

2

Я думаю, что есть третий вариант. Я могу придумать 2 простых метода на стороне сервера для кэширования, которые могут сработать для вас.

  1. Выход Кэширование
  2. System.Runtime.Caching

Кэширование вывода является весьма полезным и очень легко, если вы установите его на действие

В примере ниже действие будет кэшировать для 10 секций

public class HomeController : Controller 
{ 
    [OutputCache(Duration=10, VaryByParam="none")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

} 

Возможно, у вас может быть ключ кеширования ba СЭД на параметре

[OutputCache(Duration = int.MaxValue, VaryByParam = "id")] 
    public ActionResult Details(int id) 
    { 
     ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id); 
     return View(); 
    } 

Вот ссылка на кэширование вывода

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs

Однако, если вы хотите кэшировать на стороне сервера с System.Runtime.Caching вы можете найти хороший пример здесь http://deanhume.com/home/blogpost/object-caching----net-4/37

+0

Большое спасибо.Кэширование на стороне сервера я был немного смущен, как если бы у меня было несколько пользователей, которые смотрели отчеты, и один из них пытался экспортировать отчет в excel, а не мог бы ли он получить другой кешированный объект - в основном последний отчет, который будет запускаться любым пользователь. Кроме того, с кэшированием вывода это звучит как лучшее решение для меня, я немного интересовался временем, так как пользователь может подождать некоторое время, прежде чем экспортировать его. Будет ли я также видеть ту же проблему с несколькими пользователями или она кэшируется пользователем по отдельности? –

+0

Возможно, вы передали userId, чтобы получить данные. В этом случае вы можете кэшировать вывод в VaryByParam = "userId". Это создаст кеш для каждого пользователя. Вы также можете использовать параметр OutputCacheLocation.Client. В System.Runtime.Caching кэш-ключ должен также включать userId, чтобы кэш был на пользователя – samsur

+0

Это звучит хорошо для меня! Огромное спасибо. –

Смежные вопросы