Forum Discussion

kustbilla's avatar
kustbilla
Frequent Visitor
9 years ago

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/10b69fc3-46fa-464b-9483-41b77b426bb8/imports?datasetDisplayName=Sales"
$CODEPAGE = "iso-8859-1"

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "AppKey <accesskey>
$FileContent = [System.IO.File]::ReadAllBytes("D:\temp\RetailAnalysisSamplePBIX.pbix");
$enc = [System.Text.Encoding]::GetEncoding($CODEPAGE)
$fileEnc = $enc.GetString($FileContent)

$body = ("--$boundary$LF",
            "Content-Disposition: form-data; name=`"filename`"; filename=`"RetailAnalysisSamplePBIX.pbix`"$LF",
            "Content-Type: application/octet–stream$LF",
            $fileEnc,
            $LF,
            "--$boundary--",
            $LF) -join $LF;

Invoke-RestMethod -ContentType "multipart/form-data" -Method POST -Uri $uri -Body $body -Headers $headers

 

But when I ran this script it failed with the error "HTTP/1.1 500 Internal Server Error", I'm sure the URL/access key/pbix file path are right but it doesn't work.

 

Can someone help to figure it out? Any answer is greatly appreciated.

 

P.S. PowerShell response:

Invoke-RestMethod : {"Message":""}
At C:\Users\weihuan\Desktop\stanleytest.ps1:20 char:1
+ Invoke-RestMethod -ContentType "multipart/form-data" -Method POST -Ur ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Method: POST, R...rt/form-data
}:HttpRequestMessage) [Invoke-RestMethod], HttpResponseException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

2 Replies

  • Eric_Zhang's avatar
    Eric_Zhang
    Microsoft Employee

    kustbilla

    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();
                }
            }
        }
         
    
        }