The 404 error is because the passed table name is incorrect. CorporationProduct is the dataset name, while in your case, the table name should be product.
addRowsToDataset(datasetId, "CorporationProduct");
You should also use a foreach loop in the getDataSetID function, otherwise when there're already other datasets, you code would go to error as well.
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
class Program
{
private static string token = string.Empty;
static void Main(string[] args)
{
string datasetId = string.Empty;
try
{
token = getAuthenticationToken();
createDataset();
datasetId = getDatasetId();
addRowsToDataset(datasetId, "Product");
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"];
foreach (var result in results["value"]) {
if (result["name"] == "CorporationProduct") {
datasetId = result["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;
}
}
}