C#:使用System.Web.Caching手动缓存w /方法属性VS.

时间:2010-07-12 16:29:25

标签: c# asp.net-mvc caching

我正在调用SSRS Web服务来检索报告列表和每个报告的参数。由于SSRS没有单一的Web服务方法来获取该数据,因此我需要分两步完成。 1)获取报告列表。 2)循环浏览报告列表,并为每个报告调用Web服务方法以获取其参数。

通过多次调用获取参数,我想我应该缓存结果。我的问题是,这是正确/最佳实践方式吗?

我应该在控制器方法中使用属性吗?但是这会缓存控制器的整个输出,而不仅仅是我想要缓存的特定数据。 (伪代码)

[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 个答案:

答案 0 :(得分:1)

我不会直接在动作中进行缓存,而是创建一个可以调用来处理缓存的类。然后,您可以决定是否要在操作中进行缓存调用,或者创建一个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);
}