我正在调用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类/方法手动缓存我需要的内容吗?
答案 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);
}