2015-04-11 10 views
3

У меня есть контроллер с PartialViewResult или JsonResult тип возврата.
Я хочу кэшировать его [OutputCache], но он вообще не работает, и всегда следующий Index контроллер Thread.Sleep(5000); работает !!!Как использовать OutputCache в контроллерах PartialView в MVC 5, C#?

[HttpPost] 
[ValidateAntiForgeryToken] 
[OutputCache(Duration = 120, Location = OutputCacheLocation.Server)] 
public ActionResult Index(DevicesAjaxViewModel viewModel) 
{ 
    try 
    { 
     //Response.Cache.SetExpires(DateTime.Now.AddSeconds(30)); 
     //Response.Cache.SetCacheability(HttpCacheability.Server); 
     Response.Cache.AddValidationCallback(IsCacheValid, Request.UserAgent); 
#if DEBUG 
     Thread.Sleep(5000); 
#endif 
     if (!ModelState.IsValid) return Json(new ModelError("Error in Model")); 
     var allObjects = _objectService.GetAllObjects(); 
     string objectName = allObjects.First(q => q.Id == viewModel.ObjectId).Name; 
     KeyValuePair<int, List<DeviceModel>> keyValuePair = ApplyFiltering(objectName, viewModel.PageNumber, false, viewModel.Filtering); 
     FilteringDevicesResultModel filteringDevicesResultModel = new FilteringDevicesResultModel 
     { 
      Devices = keyValuePair.Value, 
      FoundDevicesCount = keyValuePair.Key.ToMoneyFormat(), 
      RequestId = viewModel.RequestId 
     }; 

     return PartialView("~/Views/Partials/DevicesPagePartial.cshtml", filteringDevicesResultModel); 
    } 
    catch (Exception ex) 
    { 
     return Json(new ModelError(ex.Message)); 
    } 
} 

void IsCacheValid(HttpContext httpContext, object data, ref HttpValidationStatus status) 
{ 
    if (true) 
     status = HttpValidationStatus.Valid; 
    else 
     status = HttpValidationStatus.Invalid; 
} 

Как его реализовать?

ответ

7

Значение по умолчанию OutputCache для VaryByParam равно "*", так что это будет отличаться от кеша по всем параметрам в строке запроса или параметрам в сообщении.

У вас есть маркер анти-подделки (@Html.AntiForgeryToken()) в вашей форме, который получает новое значение всякий раз, когда страница отображается, в результате чего кеш вывода считает, что это вариация.

Либо установить VaryByParam на «нет», включают в список реквизита вы хотите изменить, или указать некоторые пользовательские изменения с VaryByCustom

[OutputCache(Duration = 120, Location = OutputCacheLocation.Server, VaryByParam="none")] 
+0

Великого, он работал. –