2017-11-02 15 views
0

며칠 전 나는 파워 BI에서 리포트를 작성하는 것을 배웠으며 파워 BI를 배우는 것은 훌륭한 경험이었습니다. 내 MVC 기반 웹 응용 프로그램을위한 대시 보드를 만들면서 매력적인 대시 보드를보고 채우고 싶었습니다. 내가 그 내가보기 안에 다음 코드를 사용하고 있습니다에 대한 그것과 내장 전원 BI 보고서의 생각입니다 : - : 내가 생각할Power BI 보고서가 MVC 응용 프로그램에로드되지 않습니다.

public class DashBoardController : Controller 
    { 
     string baseUri = WebConfigurationManager.AppSettings["PowerBiDataset"]; 
     string AccessToken = string.Empty; 
     // GET: DashBoard 
     public ActionResult DashBoard() 
     { 

      if (Request.Params.Get("code") != null) 
      { 
       Session["AccessToken"] = GetAccessToken(
        Request.Params.GetValues("code")[0], 
        WebConfigurationManager.AppSettings["ClientID"], 
        WebConfigurationManager.AppSettings["ClientSecret"], 
        WebConfigurationManager.AppSettings["RedirectUrl"]); 


       Response.Redirect("~/DashBoard/DashBoard"); 
      } 

      if (Session["AccessToken"] != null) 
      { 

       AccessToken = Session["AccessToken"].ToString(); 
       GetReport(0); 
      } 
      return View(); 
     } 


     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]; 
         ViewData["AccessToken"] = Session["AccessToken"].ToString(); 
         ViewData["EmbedURL"] = report.embedUrl; 
         ViewData["ReportID"] = report.id; 
        } 
       } 
      } 
     } 

     public void GetAuthorizationCode() 
     { 

      var @params = new NameValueCollection 
      { 

       {"response_type", "code"}, 
       {"client_id", WebConfigurationManager.AppSettings["ClientID"]}, 
       {"resource", WebConfigurationManager.AppSettings["PowerBiAPI"]}, 
       { "redirect_uri", WebConfigurationManager.AppSettings["RedirectUrl"]} 
      }; 

      var queryString = HttpUtility.ParseQueryString(string.Empty); 
      queryString.Add(@params); 

      Response.Redirect(String.Format(WebConfigurationManager.AppSettings["AADAuthorityUri"] + "?{0}", queryString)); 


     } 

     public string GetAccessToken(string authorizationCode, string clientID, string clientSecret, string redirectUri) 
     { 
      TokenCache TC = new TokenCache(); 

      string authority = WebConfigurationManager.AppSettings["AADAuthorityUri"]; 
      AuthenticationContext AC = new AuthenticationContext(authority, TC); 
      ClientCredential cc = new ClientCredential(clientID, clientSecret); 

      return AC.AcquireTokenByAuthorizationCode(
       authorizationCode, 
       new Uri(redirectUri), cc).AccessToken; 
     } 
    } 
    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; } 
    } 

, 내가 -이

<body> 
    <script type="text/javascript" src="~/Scripts/PowerBI/powerbi.js"></script> 
    <script type="text/javascript"> 
    window.onload = function() { 
     var iframe = document.getElementById("iFrameEmbedReport"); 
     iframe.src = "https://app.powerbi.com/reportEmbed?reportId=" + embedReportId; 
     iframe.onload = postActionLoadReport; 
    } 

    function postActionLoadReport() { 
     var m = { 
      action: "loadReport", 
      accessToken: accessToken 
     }; 
     message = JSON.stringify(m); 

     iframe = document.getElementById("iFrameEmbedReport"); 
     iframe.contentWindow.postMessage(message, "*");; 
     } 
    </script> 
    <style> 
     #iFrameEmbedReport { 
      width: 95%; 
      height: 95%; 
     } 
    </style> 
    <iframe ID="iFrameEmbedReport"></iframe> 
</body> 

그리고 컨트롤러 코드

은 아래와 같습니다 모든 일을 제대로하고 있지만 보고서를 표시 할 수없는 이유를 모르겠습니다. 위의 코드에서 실수를했는지 제안 해주십시오. 오류가 어디에 오류 자체에 코드를 많이없고 specfics을 제공 한

+0

어떤 오류가 보이십니까? – user5226582

답변

1

그것은, 분명하지 않다. 여기에 몇 가지주의하는 것이 있습니다

  • 방금 ​​
  • 너무 많은 코드 전체 빈 div 요소를 필요로 당신의 HTML에서 전원 BI 컨텐츠를 포함하려면. 방금 얻은 토큰
  • 인스턴스화 PowerBIClient 전원 BI 측에 제공된 자격 증명을 AuthenticationContext.AcquireTokenAsync을 사용하여

    • 획득 인증 토큰 :

    당신은 다음 단계를 수행해야합니다. 그것은 귀하의 응용 프로그램에 대한 토큰입니다. 사용자에게 전달하지 마십시오. 만료됨에 따라 세션에 저장하지 마십시오. PowerBIClient(new Uri(_Context.ApiUrl), new TokenCredentials(authResult.AccessToken, "Bearer"))

  • 전원 BI에서 사용할 수있는 콘텐츠의 ID (들)을 얻습니다. 그룹 (작업 공간)에있는 콘텐츠뿐만 아니라 다양한 유형 (대시 보드, 보고서, 타일)에 대한 API가 있습니다 (예 : client.Dashboards.GetDashboardsInGroupAsync(GroupId). 당신이 이미 어떤 유형의 콘텐츠와 ID를 알고 있다면이 단계는 건너 뛸 수 있습니다. 반환 된 객체에서 EmbedUrl 속성이 비어있는 경우 수동으로 해당 URL을 구성하더라도 렌더링 할 수 없습니다.
  • 는 특정 콘텐츠에 대한 삽입 토큰를 얻습니다. 사용할 수있는 다양한 방법이 있습니다. client.Reports.GenerateTokenInGroupAsync(GroupId, Id-of-content, new GenerateTokenRequest(accessLevel: "view"))
  • 최종 단계는 클라이언트쪽에 Embed Token과 EmbedUrl을 적용하는 것입니다. 다음 줄 사이에 뭔가 :

.

var embedToken = $('#embedToken').val(); 
var txtEmbedUrl = $('#txtReportEmbed').val(); 
var txtEmbedReportId = $('#txtEmbedReportId').val(); 
var models = window['powerbi-client'].models; 
var permissions = models.Permissions.All; 

var config= { 
    type: 'report', 
    tokenType: models.TokenType.Embed, 
    accessToken: embedToken, 
    embedUrl: txtEmbedUrl, 
    id: txtEmbedReportId, 
    permissions: permissions, 
    settings: { 
     filterPaneEnabled: true, 
     navContentPaneEnabled: true 
    } 
}; 

var embedContainer = $('#embedContainer')[0]; 
var report = powerbi.embed(embedContainer, config); 

당신은 당신의 물건 here을 테스트 할 수 있어야합니다. 그냥 당신의 가치를 플러그인.

여기에서도 샘플 앱을 볼 수 있습니다. 2. 위에 제공된 흐름은 '앱 소유 데이터'의 경우입니다.