前言
最近跟同事討論 Power BI embedded 報表的速度問題,
就下載 Microsoft 的 AppOwnsData 範例來測試,
發現在 Server 要取得 ReportEmbedConfig
(包含 ReportId, ReportName, ReportUrl 及 EmbedToken) 大約需要花 1 秒左右,
在 View 接到 ReportEmbedConfig
來呈現,大約也差不多 1 秒左右,
總共大約近 2 秒的時間,那是否有什麼方式來加快報表的呈現速度嗎?
研究
在 Debug 程式的過程中發現,在 Controller 呼叫 EmbedService
的 GetEmbedParams
Method ,
會再呼叫 GetEmbedToken
來取得 embedToken 。
而 GetEmbedToken
Method 中會建立 PowerBIClient ,
所以會再透過 AadService
來取得 AccessToken 。
在 EmbedService
的 GetEmbedParams
Method 本來就有建立 PowerBIClient ,
所以 GetEmbedToken
Method 則可以直接使用它,
所以調整 GetEmbedToken
Method 如下,
1 | /// <summary> |
而 EmbedService
的 GetEmbedParams
Method 則 Call GetEmbedToken
並多傳入 PowerBIClient
物件,embedToken = GetEmbedToken(pbiClient, reportId, datasetIds, workspaceId);
重跑程式後發現,沒有省太多時間,如下,
假設報表參數是一致的,而 ReportEmbedConfig
中,只有 EmbedToken
會變動。
但 EmbedToken 期限會有一個小時,所以如果 EmbedToken 沒過期,
那就可以沿用原本的 ReportEmbedConfig
。
再來就是將取得的 ReportEmbedConfig
存到 ApplicationState 之中,
原本是每次都取 ReportEmbedConfig
給 View 處理,
1 | public async Task<ActionResult> EmbedReport(string reportId) |
以下是增加各報表 Cache 的機制,
1 | public async Task<ActionResult> EmbedReport(string reportId) |
執行測試後發現,在 Controller 取得 ReportEmbedConfig
及在 View 呈現報表的速度都有明顯的加快。
調整後的程式碼請參考:AppOwnsData-HomeConttoller-EmbedReport