Power Bi:将报告嵌入MVC网站

时间:2017-07-04 10:57:22

标签: c# asp.net-mvc powerbi

我创建了一个power bi报告。我想将此报告嵌入我的MVC网站。这是我的代码: -

 private static readonly string ClientID = ConfigurationManager.AppSettings["ClientID"];
 private static readonly string ClientSecret = ConfigurationManager.AppSettings["ClientSecret"];
 private static readonly string RedirectUrl = ConfigurationManager.AppSettings["RedirectUrl"];
 private static readonly string AADAuthorityUri = ConfigurationManager.AppSettings["AADAuthorityUri"];
 private static readonly string PowerBiAPI = ConfigurationManager.AppSettings["PowerBiAPI"];
 private static readonly string PowerBiDataset = ConfigurationManager.AppSettings["PowerBiDataset"];
 private static readonly string baseUri = PowerBiDataset;
 private static string accessToken = string.Empty;
 public class PBIReports
 {
     public PBIReport[] value { get; set; }
 }
 public class PBIReport
 {
     public string id { get; set; }
     public string name { get; set; }
     public string webUrl { get; set; }
     public string embedUrl { get; set; }
 }

 public ReportController()
 {
     try
     {
         if (Request.Params.Get("code") != null)
         {

             Session["AccessToken"] = GetAccessToken(
                 HttpContext.Request["code"],
                 ClientID,
                 ClientSecret,
                 RedirectUrl);
         }
         if (Session["AccessToken"] != null)
         {
             accessToken = Session["AccessToken"].ToString();
             GetReport(0);
         }
     }
     catch(Exception ex)
     {

     }
 }

 public string GetAccessToken(string authorizationCode, string clientID, string clientSecret, string redirectUri)
 {      
     TokenCache TC = new TokenCache();
     string authority = AADAuthorityUri;
     AuthenticationContext AC = new AuthenticationContext(authority, TC);
     ClientCredential cc = new ClientCredential(clientID, clientSecret);
     return AC.AcquireTokenByAuthorizationCodeAsync(
         authorizationCode,
         new Uri(redirectUri), cc).Result.AccessToken;
 }
 protected void GetReport(int index)
 {
     System.Net.WebRequest request = System.Net.WebRequest.Create(
         String.Format("{0}/Reports",
         baseUri)) as System.Net.HttpWebRequest;

     request.Method = "GET";
     request.ContentLength = 0;
     request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken));
     using (var response = request.GetResponse() as System.Net.HttpWebResponse)
     {
         using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
         {
             PBIReports Reports = JsonConvert.DeserializeObject<PBIReports>(reader.ReadToEnd());
             if (Reports.value.Length > 0)
             {
                 var report = Reports.value[index];

                 ViewBag["ReportId"] = report.id;
                 ViewBag["EmbedUrl"] = report.embedUrl;
                 ViewBag["ReportName"] = report.name;
                 ViewBag["WebUrl"] = report.webUrl;
             }
         }
     }
 }

 public void GetAuthorizationCode()
 {
     var @params = new NameValueCollection
     {
         {"response_type", "code"},
         {"client_id", ClientID},
         {"resource", PowerBiAPI},
         { "redirect_uri", RedirectUrl}
     };

     var queryString = HttpUtility.ParseQueryString(string.Empty);
     queryString.Add(@params);
     Response.Redirect(String.Format(AADAuthorityUri + "?{0}", queryString));
 }

 public ActionResult Index()
 {
     GetAuthorizationCode();
     return View();
 }

在重定向到&#34;报告页面&#34;,它用于power bi登录页面,在我登录后重定向回到此页面(因为主页和重定向网址相同)。但Request.Params.Get("code") != null为空。 HttpContext.Request也为空。为什么?代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

在控制器的构造函数中,您还没有this.HttpContext对象供您处置。你可能有HttpContext.Current,但我不确定。

您应该做的是将代码移动到某个操作(例如您的GetReport操作),您可以在其中进行检查。