C #: Кэширование с атрибутами метода VS вручную с использованием System.Web.Caching - PullRequest
0 голосов
/ 12 июля 2010

Я звоню в веб-службы SSRS, чтобы получить список отчетов и параметры каждого отчета.Поскольку в SSRS нет единого метода веб-службы для получения этих данных, мне нужно сделать это в два этапа.1) Получить список отчетов.2) Просмотрите список отчетов и для каждого из них вызовите метод веб-службы, чтобы получить его параметры.

При нескольких вызовах для получения параметров я решил, что должен кэшировать результаты.Мой вопрос: каков правильный / лучший способ сделать это?

Должен ли я использовать атрибуты в моем методе контроллера?Но это кэширует весь вывод контроллера, а не только конкретные данные, которые я хочу кэшировать.(Псевдокод)

[OutputCache(Duration=3600, VaryByParam="none")]
public ActionResult GetReportList()
{
    var rService = GetReportService();
    var reportList = rService.ListChildren(ReportsRoot, true);

    foreach (var report in reportList)
    {
        rService.GetParameters(report.Name);
    }

    return Json(result);
}

Или я должен пройти и вручную кэшировать только то, что мне нужно, используя System.Web.Caching классы / метод?

1 Ответ

1 голос
/ 12 июля 2010

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

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

ActionFilter.cs

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public sealed class PutStuffInCacheAttribute : ActionFilterAttribute
    {
           // Fires before the action
       public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
                var context = filterContext.HttpContext;
                SomeData result = (SomeData)context.Cache["reports"];
                if (result == null)
                {
                    var reports = new myReportsListClass();         
                    var result = reports.GetReportsData();
                    context.Cache.Add("reports", result);
                }

                filterContext.RouteData.Values.Add("reports", result);
            }   

            //Fires after the action but before view is complete.
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }       
        }

Controller.cs

[PutStuffInCache]
public ActionResult GetReportList()
{
    var result = (SomeData)this.RouteData.Values["reports"];
    return Json(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...