We have multitenant system and we are trying to use the same report for each, but with updating the connectionstring/credentials. We have a default report that was built in Power BI Desktop based off of a azure database (that is the same per tenant) that we upload, change the connectionstring and then update the credentials. We aren't receiving any errors with the API calls, but we are running into an issue when trying to then view that report.
Here is our upload/change code:
public static IPowerBIClient CreateClient()
{
var credentials = new TokenCredentials(AppSettings.AccessKey, "AppKey");
return new PowerBIClient(credentials) { BaseUri = new Uri(AppSettings.ApiUrl) };
}
public static string UploadReport(string workspaceId, string reportName, Stream fileStream, string connectionString) { SqlConnectionStringBuilder lConnectonString = new SqlConnectionStringBuilder(connectionString); string lUserID = lConnectonString.UserID; string lPassword = lConnectonString.Password; using (var lClient = CreateClient()) { Import lImport = lClient.Imports.PostImportWithFile(AppSettings.WorkspaceCollection, workspaceId, fileStream, reportName); //Poll for import to complete int lCount = 0; while (lCount++ < 20 && lImport.ImportState != "Succeeded" && lImport.ImportState != "Failed") { System.Threading.Thread.Sleep(500); lImport = lClient.Imports.GetImportById(AppSettings.WorkspaceCollection, workspaceId, lImport.Id); } if (lImport.Reports.Count != 1) throw new ArgumentOutOfRangeException("Invalid report ID"); string lReportID = lImport.Reports[0].Id; Report lReport = lClient.Reports.GetReports(AppSettings.WorkspaceCollection, workspaceId).Value.First(x => x.Id.Equals(lReportID)); Dataset lDataset = lClient.Datasets.GetDatasets(AppSettings.WorkspaceCollection, workspaceId).Value.First(x => x.Name.Equals(lReport.Name)); SqlConnectionStringBuilder lNewConnectionString = new SqlConnectionStringBuilder() { DataSource = lConnectonString.DataSource.Replace(",1433", "").Replace("tcp:", ""), InitialCatalog = lConnectonString.InitialCatalog, UserID = lUserID, Password = lPassword, PersistSecurityInfo = false }; var connectionParameters = new Dictionary<string, object> { { "connectionString", lNewConnectionString.ConnectionString } }; lClient.Datasets.SetAllConnections(AppSettings.WorkspaceCollection, workspaceId, lDataset.Id, connectionParameters); // Get the datasources from the dataset var lDataSources = lClient.Datasets.GetGatewayDatasources(AppSettings.WorkspaceCollection, workspaceId, lDataset.Id); GatewayDatasource lDataSource = lDataSources.Value[0]; // Reset your connection credentials GatewayDatasource lGatewayDatasource = new GatewayDatasource { CredentialType = "Basic", BasicCredentials = new BasicCredentials { Username = lUserID, Password = lPassword } }; // Update the datasource with the specified credentials lClient.Gateways.PatchDatasource(AppSettings.WorkspaceCollection, workspaceId, lDataSource.GatewayId, lDataSource.Id, lGatewayDatasource); return lReportID; } }
This is the error we are receiving when trying to then view the report: