Forum Discussion
kustbilla
9 years agoFrequent Visitor
500 Internal Server Error encountered when importing PBIX file using PowerShell script
I created below PowerShell script to import PBIX file to workspace: $LF = "`r`n" $boundary = "----------abcdefghijklmn" $uri = "https://api.powerbi.cn/v1.0/collections/stanley-test/workspaces/1...
Eric_Zhang
9 years agoMicrosoft Employee
I know how to call the import api to upload a pbix file in C#, however I don't have much expertise on PowerShell. Please reference below C# code and modify the powershell script accordingly
using System;
using System.Net;
using System.IO;
namespace PBIGettingStarted
{
class Program
{
//Access key for app token
private static string accessKey = "myaccesskey";
//Power BI app token values
private static string workspaceCollectionName = "myworkspace";
private static string workspaceId = "myworkspaceid";
private static string pbixFileName = "AdventureWorksdddd.pbix";
static void Main(string[] args)
{
//Imports uri
var uri = String.Format
("https://api.powerbi.com/v1.0/collections/{0}/workspaces/{1}/imports?datasetDisplayName=SampleImport",
workspaceCollectionName, workspaceId);
//PBIX file to import
DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
string fileName = @"C:\test\mytest.pbix";
//Create web request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
//Import Request format:
// Header:
// Content - Type: multipart / form - data; ----------BOUNDARY
// Authorization: AppToken
// Body:
// ----------BOUNDARY
// Content - Disposition: form - data; filename = "{pbix file}.pbix"
// Content - Type: application / octet – stream
//Define POST
request.Method = "POST";
request.UseDefaultCredentials = true;
//Header
// Boundary
string boundary = "----------BOUNDARY";
byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
// Content - Type
request.ContentType = "multipart/form-data; boundary=" + boundary;
// Authorization - Use AppToken jwt for Authorization header
request.Headers.Add("Authorization", String.Format("AppKey {0}", accessKey));
//Body
string bodyTemplate = "Content-Disposition: form-data; filename=\"{0}\"\r\nContent-Type: application / octet - stream\r\n\r\n";
string body = string.Format(bodyTemplate, fileName);
byte[] bodyBytes = System.Text.Encoding.UTF8.GetBytes(body);
//Get request stream
using (Stream rs = request.GetRequestStream())
{
rs.Write(boundaryBytes, 0, boundaryBytes.Length);
rs.Write(bodyBytes, 0, bodyBytes.Length);
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
rs.Write(buffer, 0, bytesRead);
}
}
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
}
//Get response
using (HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
{
//If Import succeeds, StatusCode = Accepted
var responseStatusCode = response.StatusCode.ToString();
}
}
}
}
kustbilla
9 years agoFrequent Visitor
Thanks Eric for your kind help:smileyhappy: