首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:使用方法缓存属性与使用System.Web.Caching手动缓存

C#:使用方法缓存属性与使用System.Web.Caching手动缓存
EN

Stack Overflow用户
提问于 2010-07-13 00:29:25
回答 1查看 455关注 0票数 0

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

通过多次调用来获取参数,我认为我应该缓存结果。我的问题是,哪种方法是正确的/最佳的实践方法?

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

代码语言:javascript
复制
[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类/方法遍历并手动缓存我需要的内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-13 00:46:14

我不会直接在操作中进行缓存,而是创建一个您可以调用来处理缓存的类。然后,您可以决定是在操作中进行缓存调用,还是创建一个ActionFilter来处理它。

下面是如何在ActionFilter中处理缓存,并将其传递给需要它的操作。

ActionFilter.cs

代码语言:javascript
复制
    [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

代码语言:javascript
复制
[PutStuffInCache]
public ActionResult GetReportList()
{
    var result = (SomeData)this.RouteData.Values["reports"];
    return Json(result);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3230262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档