我调用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类/方法遍历并手动缓存我需要的内容?
发布于 2010-07-13 00:46:14
我不会直接在操作中进行缓存,而是创建一个您可以调用来处理缓存的类。然后,您可以决定是在操作中进行缓存调用,还是创建一个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);
}https://stackoverflow.com/questions/3230262
复制相似问题