2010-07-12 54 views
0

我在調用SSRS Web服務來檢索報告列表和每個報告的參數。由於SSRS沒有單一的Web服務方法來獲取這些數據,我需要分兩步來完成。 1)獲取報告列表。 2)遍歷報告列表和每個報告列表,調用Web服務方法來獲取其參數。C#:緩存w /方法屬性VS手動使用System.Web.Caching

通過多次調用來獲取參數,我想我應該緩存結果。我的問題是,這是做到這一點的正確/最佳實踐方式?

我應該在我的控制器方法中使用屬性嗎?但是,它會緩存控制器的整個輸出,而不僅僅是要緩存的特定數據。 (僞代碼)

[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

我不會直接在動作中進行緩存,而是創建一個可以調用來處理緩存的類。然後,您可以決定是否要在操作中創建緩存調用,或者創建一個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); 
} 
+0

薩德,感謝響應。你介意在你的回答中詳細解釋一下嗎?也許有一些僞代碼,特別是在ActionFilter上?我是C#/ .NET的新手。 – Jason 2010-07-12 16:48:17