Forum Discussion
Generate Embed Token For Create Issue
private static void generateEmbedToken()
{
// TokenCredentials Initializes a new instance of the
// Microsoft.Rest.TokenCredentials class with
// the given 'Bearer' token.
var credentials = new TokenCredentials(token);
// Initialize PowerBIClient with credentials
var powerBIclient = new Microsoft.PowerBI.Api.V2.PowerBIClient(credentials)
{
// BaseUri is the api endpoint, default is https://api.powerbi.com
BaseUri = new Uri("https://api.powerbi.com")
};
try
{
// Create body where accessLevel = View, datasetId = "" by default
var requestParameters = new GenerateTokenRequest(TokenAccessLevel.Create, datasetId, true);
// Generate EmbedToken This function sends the POST message
//with all parameters and returns the token
EmbedToken token = powerBIclient.Reports.GenerateTokenForCreate(requestParameters);
embedToken = token.Token;
}
catch (Exception exc)
{
Console.WriteLine(exc.ToString());
}
}Microsoft.Rest.HttpOperationException: Operation returned an invalid status code 'NotFound'
at Microsoft.PowerBI.Api.V2.Reports.<GenerateTokenForCreateWithHttpMessagesAsync>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.PowerBI.Api.V2.ReportsExtensions.<GenerateTokenForCreateAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.PowerBI.Api.V2.ReportsExtensions.GenerateTokenForCreate(IReports operations, GenerateTokenRequest requestParameters)
at PushDataApp.Program.generateEmbedToken() in C:\Users\PC\Documents\Visual Studio 2017\Projects\PushDataApp\PushDataApp\Program.cs:line 388
EmbedToken token = powerBIclient.Reports.GenerateTokenForCreate(requestParameters);
I may doubt that there's some issue with the Power BI API lib, as I've found the token generation functions for reports, dashboards, tiles but not for datasets.
powerBIclient.Reports.GenerateTokenxxxxx powerBIclient.Dashboards.GenerateTokenxxxxx powerBIclient.Tiles.GenerateTokenxxxxx
So I guess for Datasets, it should be
powerBIclient.Datasets.GenerateTokenxxxxx
Unfortunately, I'm not finding any GenerateTokenxxxxx for datasetsInstead of using the API lib, call the REST API directly.
using System; //Install-Package Newtonsoft.Json using Newtonsoft.Json; using System.Net; using System.IO; namespace GenerateEmbeddedToken { class Program { static void Main(string[] args) { string EmbedTokenForDataSet = generateEmbedTokenForDataSet("the groupID", "the datasetID", "eyxxxxxxxxxtoken"); Console.WriteLine(EmbedTokenForDataSet); Console.ReadKey(); } private static string generateEmbedTokenForDataSet(string groupID, string datasetID, string accessBearerToken) { string embedToken = ""; HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp(String.Format("https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/GenerateToken", groupID)); //POST web request to create a datasource. request.KeepAlive = true; request.Method = "POST"; request.ContentType = "application/json"; //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", accessBearerToken)); string PostData = "{"+ "\"accessLevel\": \"Create\","+ "\"datasetId\": \""+datasetID+"\","+ "\"allowSaveAs\": true"+ "}"; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(PostData); try { //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); var response = (HttpWebResponse)request.GetResponse(); var responseJson = new StreamReader(response.GetResponseStream()).ReadToEnd(); dynamic responseString = JsonConvert.DeserializeObject<dynamic>(responseJson.ToString()); embedToken = responseString["token"]; } } catch (WebException wex) { if (wex.Response != null) { using (var errorResponse = (HttpWebResponse)wex.Response) { using (var reader = new StreamReader(errorResponse.GetResponseStream())) { string errorString = reader.ReadToEnd(); dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString); Console.WriteLine(respJson.toString()); //TODO: use JSON.net to parse this string and look at the error message } } } } return embedToken; } } }
5 Replies
- Eric_ZhangMicrosoft Employee
I may doubt that there's some issue with the Power BI API lib, as I've found the token generation functions for reports, dashboards, tiles but not for datasets.
powerBIclient.Reports.GenerateTokenxxxxx powerBIclient.Dashboards.GenerateTokenxxxxx powerBIclient.Tiles.GenerateTokenxxxxx
So I guess for Datasets, it should be
powerBIclient.Datasets.GenerateTokenxxxxx
Unfortunately, I'm not finding any GenerateTokenxxxxx for datasetsInstead of using the API lib, call the REST API directly.
using System; //Install-Package Newtonsoft.Json using Newtonsoft.Json; using System.Net; using System.IO; namespace GenerateEmbeddedToken { class Program { static void Main(string[] args) { string EmbedTokenForDataSet = generateEmbedTokenForDataSet("the groupID", "the datasetID", "eyxxxxxxxxxtoken"); Console.WriteLine(EmbedTokenForDataSet); Console.ReadKey(); } private static string generateEmbedTokenForDataSet(string groupID, string datasetID, string accessBearerToken) { string embedToken = ""; HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp(String.Format("https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/GenerateToken", groupID)); //POST web request to create a datasource. request.KeepAlive = true; request.Method = "POST"; request.ContentType = "application/json"; //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", accessBearerToken)); string PostData = "{"+ "\"accessLevel\": \"Create\","+ "\"datasetId\": \""+datasetID+"\","+ "\"allowSaveAs\": true"+ "}"; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(PostData); try { //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); var response = (HttpWebResponse)request.GetResponse(); var responseJson = new StreamReader(response.GetResponseStream()).ReadToEnd(); dynamic responseString = JsonConvert.DeserializeObject<dynamic>(responseJson.ToString()); embedToken = responseString["token"]; } } catch (WebException wex) { if (wex.Response != null) { using (var errorResponse = (HttpWebResponse)wex.Response) { using (var reader = new StreamReader(errorResponse.GetResponseStream())) { string errorString = reader.ReadToEnd(); dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString); Console.WriteLine(respJson.toString()); //TODO: use JSON.net to parse this string and look at the error message } } } } return embedToken; } } }- ZirochkaFrequent Visitor
I tried to use your function, but it didn't help.
using System; //Install-Package Newtonsoft.Json using Newtonsoft.Json; using System.Net; using System.IO; namespace GenerateEmbeddedToken { class Program { static void Main(string[] args) { string EmbedTokenForDataSet = generateEmbedTokenForDataSet("the groupID", "the datasetID", "eyxxxxxxxxxtoken"); Console.WriteLine(EmbedTokenForDataSet); Console.ReadKey(); } private static string generateEmbedTokenForDataSet(string groupID, string datasetID, string accessBearerToken) { string embedToken = ""; HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp(String.Format("https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/GenerateToken", groupID)); //POST web request to create a datasource. request.KeepAlive = true; request.Method = "POST"; request.ContentType = "application/json"; //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", accessBearerToken)); string PostData = "{"+ "\"accessLevel\": \"Create\","+ "\"datasetId\": \""+datasetID+"\","+ "\"allowSaveAs\": true"+ "}"; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(PostData); try { //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); var response = (HttpWebResponse)request.GetResponse(); var responseJson = new StreamReader(response.GetResponseStream()).ReadToEnd(); dynamic responseString = JsonConvert.DeserializeObject<dynamic>(responseJson.ToString()); embedToken = responseString["token"]; } } catch (WebException wex) { if (wex.Response != null) { using (var errorResponse = (HttpWebResponse)wex.Response) { using (var reader = new StreamReader(errorResponse.GetResponseStream())) { string errorString = reader.ReadToEnd(); dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString); Console.WriteLine(respJson.toString()); //TODO: use JSON.net to parse this string and look at the error message } } } } return embedToken; } } }On line:
using (Stream writer = request.GetRequestStream())
program thinks for approximately 30 seconds and then goes to catch block.
In catch block if statement is false (so, Response == null) and program just goes out from catch.
That's all.
I still don't understant why it happens because I just use this guide for POST requests (https://msdn.microsoft.com/library/mt784614.aspx). And it's up to date (Updated: July 21, 2017), so, I don't understand.
I'll appresiate any help.
- Eric_ZhangMicrosoft Employee
Zirochka wrote:
I tried to use your function, but it didn't help.
using System; //Install-Package Newtonsoft.Json using Newtonsoft.Json; using System.Net; using System.IO; namespace GenerateEmbeddedToken { class Program { static void Main(string[] args) { string EmbedTokenForDataSet = generateEmbedTokenForDataSet("the groupID", "the datasetID", "eyxxxxxxxxxtoken"); Console.WriteLine(EmbedTokenForDataSet); Console.ReadKey(); } private static string generateEmbedTokenForDataSet(string groupID, string datasetID, string accessBearerToken) { string embedToken = ""; HttpWebRequest request = System.Net.HttpWebRequest.CreateHttp(String.Format("https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/GenerateToken", groupID)); //POST web request to create a datasource. request.KeepAlive = true; request.Method = "POST"; request.ContentType = "application/json"; //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", accessBearerToken)); string PostData = "{"+ "\"accessLevel\": \"Create\","+ "\"datasetId\": \""+datasetID+"\","+ "\"allowSaveAs\": true"+ "}"; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(PostData); try { //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); var response = (HttpWebResponse)request.GetResponse(); var responseJson = new StreamReader(response.GetResponseStream()).ReadToEnd(); dynamic responseString = JsonConvert.DeserializeObject<dynamic>(responseJson.ToString()); embedToken = responseString["token"]; } } catch (WebException wex) { if (wex.Response != null) { using (var errorResponse = (HttpWebResponse)wex.Response) { using (var reader = new StreamReader(errorResponse.GetResponseStream())) { string errorString = reader.ReadToEnd(); dynamic respJson = JsonConvert.DeserializeObject<dynamic>(errorString); Console.WriteLine(respJson.toString()); //TODO: use JSON.net to parse this string and look at the error message } } } } return embedToken; } } }On line:
using (Stream writer = request.GetRequestStream())
program thinks for approximately 30 seconds and then goes to catch block.
In catch block if statement is false (so, Response == null) and program just goes out from catch.
That's all.
I still don't understant why it happens because I just use this guide for POST requests (https://msdn.microsoft.com/library/mt784614.aspx). And it's up to date (Updated: July 21, 2017), so, I don't understand.
I'll appresiate any help.
Have you got any API console tool for testing purpose? If not, I'd suggest using POSTMAN.
So beforing coding in C#, can you test this GenerateToken in postman? For any issue, feel free to post.