C# 无法使用API更改电源BI连接字符串

C# 无法使用API更改电源BI连接字符串,c#,active-directory,powerbi,C#,Active Directory,Powerbi,我正在尝试使用他们的API(Microsoft.IdentityModel.Clients.ActiveDirectory)更改Power BI连接字符串。使用此API,我可以将.pbix文件发布到我的PBI帐户。但在尝试更新数据集连接字符串时,获取错误请求错误。这是我的密码 var client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept", "application/json"); client.DefaultRe

我正在尝试使用他们的API
(Microsoft.IdentityModel.Clients.ActiveDirectory)
更改Power BI连接字符串。使用此API,我可以将.pbix文件发布到我的PBI帐户。但在尝试更新数据集连接字符串时,获取
错误请求
错误。这是我的密码

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

var restUrlImportPbix = POWER_BI_SERVICE_ROOT_URL + $"datasets/{dataset.id}/Default.SetAllConnections";

var postData = new { connectionString = _powerBISettings.DataConnectionString };
var response = client.PostAsync(restUrlImportPbix, new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json")).Result;

我还在博客中发现SetAllConnections只在直接查询连接上起作用。请任何人帮忙。

除了尝试通过更改连接字符串重定向数据源外,您还可以通过允许报表本身切换其数据源来实现同样的目的。为此,请在报告中使用。为此,通过单击
编辑查询打开
Power Query Editor
,并在
管理参数中定义两个新的文本参数,将它们命名为
ServerName
DatabaseName

将其当前值设置为指向您的一个数据源,例如,
SQLSERVER2016
和“AdventureWorks2016
”。然后右键单击报告中的查询并打开
Advanced Editor`。在M代码中查找服务器名称和数据库名称:

并用上面定义的参数替换它们,因此M代码如下所示:

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

var restUrlUpdateParameters = POWER_BI_SERVICE_ROOT_URL + $"datasets/{dataset.id}/Default.UpdateParameters";
var postData = new { updateDetails = new[] { new { name = "ServerName", newValue = "NEWSERVER" }, new { name = "DatabaseName", newValue = "Another_AdventureWorks2016" } } };
var responseUpdate = client.PostAsync(restUrlUpdateParameters, new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json")).Result;

var restUrlRefreshDataset = POWER_BI_SERVICE_ROOT_URL + $"datasets/{dataset.id}/refreshes";
var responseRefresh = client.PostAsync(restUrlRefreshDataset, null).Result;

现在,您可以关闭并应用更改,并且您的报告应该像以前一样工作。但现在,当您要更改数据源时,请使用
编辑参数

并将服务器和/或数据库名称更改为指向要用于报表的其他数据源:

更改参数值后,Power BI Desktop将要求您应用更改并从新数据源重新加载数据。要更改在Power BI服务中发布的报告的参数值(即数据源),请转到dataset的设置并输入新的服务器和/或数据库名称:

如果服务器是本地的,请检查网关连接
,以确保它已正确配置为使用正确的网关。您可能还需要在
管理网关
中检查可用网关:

更改数据源后,刷新数据集以从新数据源获取数据。使用Power BI Pro帐户,您可以每24小时执行8次,而如果数据集具有专用容量,则此限制将提高到每24小时48次

要以编程方式执行此操作,请使用/和/REST API调用,或者如果我修改了您的代码,请执行以下操作:

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);

var restUrlUpdateParameters = POWER_BI_SERVICE_ROOT_URL + $"datasets/{dataset.id}/Default.UpdateParameters";
var postData = new { updateDetails = new[] { new { name = "ServerName", newValue = "NEWSERVER" }, new { name = "DatabaseName", newValue = "Another_AdventureWorks2016" } } };
var responseUpdate = client.PostAsync(restUrlUpdateParameters, new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json")).Result;

var restUrlRefreshDataset = POWER_BI_SERVICE_ROOT_URL + $"datasets/{dataset.id}/refreshes";
var responseRefresh = client.PostAsync(restUrlRefreshDataset, null).Result;

这是一种使您的报告“可切换”的简单方法,例如,将一份报告从DEV或QA切换到PROD环境,或者作为灾难恢复计划的一部分,将某些工作组中的所有报告自动切换到另一个DR服务器。一般来说,我建议在所有报告中定义此类特定于连接的参数。

发布后,您可能会遇到凭据问题。我会使用像wireshark或fiddler这样的嗅探器,将发布前的第一个请求与失败的第一个请求进行比较,并确保所有头匹配。发布后,您是在同一台机器上运行还是在不同的机器上运行?我将在运行的机器上测试发布结果,以验证发布代码是否正常工作。我还将检查VS bin文件夹,并确保发布后bin文件夹中的所有文件都与可执行文件位于同一文件夹中。您是说错误是由于同时使用来自两台不同机器的相同令牌造成的吗?PBIX文件是XML,它是文本,可以用记事本打开。检查文件以查看发布后所有引用是否有效。XML可能引用了其他文件夹中的文件。我读得太快了。下面是“OFFICE XML”:。因此,您应该能够使用Word打开..pbix文件是zip文件。将扩展名更改为zip并将其打开。它包含多个xml文件。我在几天后就得到了这个解决方案。但仍然无法更改数据源用户名和密码。有解决方案吗?在安装和配置数据源的网关时,您正在输入该数据源的凭据。所以它应该使用它们。是的,我能做到。但我正试图为不同的帐户使用相同的pbix文件。我不想使用power bi desktop多次更改它们。我不明白,pbix文件中既没有保存数据源凭据,也没有使用网关配置和凭据。因此,您可以根据需要多次发布相同的pbix文件,并将每个文件指向不同的数据源(或者不同的帐户,如果我使用您的话)。你说的“多次改变”是什么意思?哦,好吧,我明白了。