Hi There;
I try to impement the power bi solution located there; https://powerbi.microsoft.com/en-us/documentation/powerbi-developer-walkthrough-push-data-register-app-with-azure-ad/ My data resides at the power BI database (or cloud I am not sure about the location). Dataset is created successfully, however, there is a problem in addRowsToDataset function. What am I missing? Thanks in advance.
class Program { private static string token = string.Empty; static void Main(string[] args) { string datasetId = string.Empty; try { token = getAuthenticationToken(); datasetId = getDatasetId(); createDataset(); addRowsToDataset(datasetId, "CorporationProduct"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine("An error occured in main function. "); Console.WriteLine(ex.Message); } } private static string getAuthenticationToken() { string token = null; // TODO: Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.21.301221612 // and add using Microsoft.IdentityModel.Clients.ActiveDirectory try { //The client id that Azure AD created when you registered your client app. string clientID = "myclientid"; //RedirectUri you used when you register your app. //For a client app, a redirect uri gives Azure AD more details on the application that it will authenticate. // You can use this redirect uri for your client app string redirectUri = "https://login.live.com/oauth20_desktop.srf"; //Resource Uri for Power BI API string resourceUri = "https://analysis.windows.net/powerbi/api"; //OAuth2 authority Uri string authorityUri = "https://login.windows.net/common/oauth2/authorize"; //Get access token: // To call a Power BI REST operation, create an instance of AuthenticationContext and call AcquireToken // AuthenticationContext is part of the Active Directory Authentication Library NuGet package // To install the Active Directory Authentication Library NuGet package in Visual Studio, // run "Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory" from the nuget Package Manager Console. // AcquireToken will acquire an Azure access token // Call AcquireToken to get an Azure token from Azure Active Directory token issuance endpoint AuthenticationContext authContext = new AuthenticationContext(authorityUri); token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri)).AccessToken; Console.WriteLine(token); Console.WriteLine("getAuthenticationToken operation is successfull."); Console.WriteLine("***"); } catch (Exception ex) { Console.WriteLine("getAuthenticationToken encounters an error: "); Console.WriteLine(ex.Message); } return token; } /// <summary> /// Azure'de veri kümesi oluşturan yordam. /// </summary> /// <remarks> System.Net ve using System.IO eklenmeli. </remarks> private static void createDataset() { HttpWebRequest request = null; string datasetJson = null; //Push data into a Power BI dashboard try { string powerBIDatasetsApiUrl = "https://api.powerbi.com/v1.0/myorg/datasets"; //POST web request to create a dataset. //To create a Dataset in a group, use the Groups uri: https://api.PowerBI.com/v1.0/myorg/groups/{group_id}/datasets request = System.Net.WebRequest.Create(powerBIDatasetsApiUrl) as System.Net.HttpWebRequest; request.KeepAlive = true; request.Method = "POST"; request.ContentType = "application/json"; if(String.IsNullOrEmpty(token)) { Console.WriteLine("token is null. "); return; } //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", token)); //Create dataset JSON for POST request datasetJson = "{\"name\": \"CorporationProduct\", \"tables\": " + "[{\"name\": \"Product\", \"columns\": " + "[{ \"name\": \"ProductID\", \"dataType\": \"Int64\"}, " + "{ \"name\": \"Name\", \"dataType\": \"string\"}, " + "{ \"name\": \"Category\", \"dataType\": \"string\"}," + "{ \"name\": \"IsCompete\", \"dataType\": \"bool\"}," + "{ \"name\": \"ManufacturedOn\", \"dataType\": \"DateTime\"}" + "]}]}"; request.ContentLength = datasetJson.Length; //POST web request byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(datasetJson); request.ContentLength = byteArray.Length; //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); writer.Close(); var response = (HttpWebResponse)request.GetResponse(); Console.WriteLine(string.Format("Dataset {0}", response.StatusCode.ToString())); Console.WriteLine("createDataset operation is successfull."); Console.WriteLine("***"); } } catch (Exception ex) { Console.WriteLine("createDataset encounters an error: "); Console.WriteLine(ex.Message); } } private static string getDatasetId() { string datasetId = string.Empty; string powerBIDatasetsApiUrl = "https://api.powerbi.com/v1.0/myorg/datasets"; try { //POST web request to create a dataset. //To create a Dataset in a group, use the Groups uri: https://api.PowerBI.com/v1.0/myorg/groups/{group_id}/datasets HttpWebRequest request = System.Net.WebRequest.Create(powerBIDatasetsApiUrl) as System.Net.HttpWebRequest; request.KeepAlive = true; request.Method = "GET"; request.ContentLength = 0; request.ContentType = "application/json"; if(String.IsNullOrEmpty(token)) { Console.WriteLine("token is empty."); return null; } //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", token)); //Get HttpWebResponse from GET request using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse) { //Get StreamReader that holds the response stream using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream())) { string responseContent = reader.ReadToEnd(); //TODO: Install NuGet Newtonsoft.Json package: Install-Package Newtonsoft.Json //and add using Newtonsoft.Json var results = JsonConvert.DeserializeObject<dynamic>(responseContent); //Get the first id datasetId = results["value"][0]["id"]; Console.WriteLine(String.Format("Dataset ID: {0}", datasetId)); Console.WriteLine("getDatasetId operation is successfull. "); Console.WriteLine("***"); } } } catch (Exception ex) { Console.WriteLine("getDatasetId encounters an error. "); Console.WriteLine(ex.Message); } return datasetId; } private static void addRowsToDataset(string DatasetId, string TabloAdi) { string powerBIApiAddRowsUrl = null; HttpWebRequest request = null; try { powerBIApiAddRowsUrl = String.Format("https://api.powerbi.com/v1.0/myorg/datasets/{0}/tables/{1}/rows", DatasetId, TabloAdi); //POST web request to add rows. //To add rows to a dataset in a group, use the Groups uri: https://api.powerbi.com/v1.0/myorg/groups/{group_id}/datasets/{dataset_id}/tables/{table_name}/rows //Change request method to "POST" request = System.Net.WebRequest.Create(powerBIApiAddRowsUrl) as System.Net.HttpWebRequest; request.KeepAlive = true; request.Method = "POST"; request.ContentLength = 0; request.ContentType = "application/json"; if(String.IsNullOrEmpty(token)) { Console.WriteLine("token is empty"); return; } //Add token to the request header request.Headers.Add("Authorization", String.Format("Bearer {0}", token)); //JSON content for product row string rowsJson = "{\"rows\":" + "[{\"ProductID\":1,\"Name\":\"Adjustable Race\",\"Category\":\"Components\",\"IsCompete\":true,\"ManufacturedOn\":\"07/30/2014\"}," + "{\"ProductID\":2,\"Name\":\"LL Crankarm\",\"Category\":\"Components\",\"IsCompete\":true,\"ManufacturedOn\":\"07/30/2014\"}," + "{\"ProductID\":3,\"Name\":\"HL Mountain Frame - Silver\",\"Category\":\"Bikes\",\"IsCompete\":true,\"ManufacturedOn\":\"07/30/2014\"}]}"; //POST web request byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(rowsJson); request.ContentLength = byteArray.Length; //Write JSON byte[] into a Stream using (Stream writer = request.GetRequestStream()) { writer.Write(byteArray, 0, byteArray.Length); //Here is the erroneous point: var response = (HttpWebResponse)request.GetResponse(); } Console.WriteLine("addRowsToDataset operation is successfull. "); Console.WriteLine("***"); } catch (Exception ex) { Console.WriteLine("addRowsToDataset encounters an error."); Console.WriteLine(ex.Message); return; } } }