我的应用程序(ASP.NET MVC)使用Office 365身份验证,它运行正常。但现在我想在我的应用程序中显示一些功能BI报告。但是,如果我使用Office 365访问令牌访问Power BI Web API,则会失败。有人可以给我这个工作代码吗?
o生成我在代码后使用的令牌。
private static string getAccessToken()
{
var authority = "https://login.windows.net/<tenantId>";
var authContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential("clientId", "client Secret");
var result = authContext.AcquireToken("https://analysis.windows.net/powerbi/api", clientCredential);
return result.AccessToken;
}
这将返回访问令牌。现在我将使用此访问令牌从power BI检索报告详细信息。
protected void getReportsButton_Click(object sender, EventArgs e)
{
var token = getAccessToken();
string responseContent = string.Empty;
//Configure datasets request
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}", token));
//Get datasets response from request.GetResponse()
using (var response = request.GetResponse() as System.Net.HttpWebResponse)
{
//Get reader from response stream
using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
{
responseContent = reader.ReadToEnd();
//Deserialize JSON string
PBIReports PBIReports = JsonConvert.DeserializeObject<PBIReports>(responseContent);
tb_reportsResult.Text = string.Empty;
//Get each Dataset from
foreach (PBIReport rpt in PBIReports.value)
{
tb_reportsResult.Text += String.Format("{0}\t{1}\t{2}\n", rpt.id, rpt.name, rpt.embedUrl);
}
}
}
}
但是这个方法给了我一个错误(远程服务器返回了一个错误:(403)Forbidden。)。
谢谢, Erandika。
答案 0 :(得分:0)
如果它可以提供帮助,这是我用来连接Power BI的代码。此示例还在我的Power BI订阅中查找数据集。
private void Sign_Click(object sender, EventArgs e)
{
try
{
string resourceUri = "https://analysis.windows.net/powerbi/api";
string clientID = "123456-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
string redirectUri = "https://login.live.com/oauth20_desktop.srf";
string authorityUri = "https://login.windows.net/common/oauth2/authorize";
AuthenticationContext authContext = new AuthenticationContext(authorityUri);
string token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri),PromptBehavior.RefreshSession).AccessToken;
_MyToken = token;
if (string.IsNullOrEmpty (_MyToken))
{
txtToken.Text = "Problème de connexion !";
}
else
{
txtToken.Text = "Connecté !";
txtResultat.Clear();
HttpWebRequest request = System.Net.WebRequest.Create(txtURI.Text) as System.Net.HttpWebRequest;
request.KeepAlive = true;
request.Method = "GET";
request.ContentLength = 0;
request.ContentType = "application/json";
request.Headers.Add("Authorization", String.Format("Bearer {0}", _MyToken));
using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
{
//Rajoutez la référence System.Web.Extensions
using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
{
string responseContent = reader.ReadToEnd();
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
Datasets datasets = (Datasets)jsonSerializer.Deserialize(responseContent, typeof(Datasets));
for (int i = 0; i < datasets.value.Count(); i++)
{
txtResultat.Text += "{" + i + "} " + datasets.value[i].Name + "\r\n";
comboDataSets.Items.Insert (i, datasets.value[i].Name);
MyDataSet.Add(new dataset(datasets.value[i].Id, datasets.value[i].Name));
}
}
}
}
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message);
}
}