这似乎是一场噩梦,当然很容易将 nuget 包升级到 3.11 我认为最新的是,但随后什么都没有编译。所以你修复了编译错误,然后它不起作用。我在尝试创建 PowerBI 客户端时收到错误。
获取令牌和创建客户端似乎与 v2 完全不同。
这是我的代码:
public PowerBiConfig GetPowerBiConfig(string reportId)
{
var result = new PowerBiConfig();
try
{
if (!Guid.TryParse(reportId, out var _))
{
result.ErrorMessage = $"Invalid report guid: {reportId}";
return result;
}
var credential = new UserPasswordCredential(_powerBiProMasterUsername, _powerBiProMasterPassword);
var authenticationContext = new AuthenticationContext(AuthorityUrl);
// Taken from https://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
var authenticationResult = authenticationContext.AcquireTokenAsync(ResourceUrl, dataArchiverSettings.PowerBiApplicationId, credential).GetAwaiter().GetResult();
if (authenticationResult == null)
{
result.ErrorMessage = "Authentication Failed.";
return result;
}
var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");
using (var client = new PowerBIClient(new Uri(ApiUrl), tokenCredentials))
{
var report = client.Reports.GetReportInGroup(dataArchiverSettings.PowerBiWorkspaceId, reportId);
if (report == null)
{
result.ErrorMessage = $"No report with the ID {reportId} was found in the workspace.";
return result;
}
var datasets = client.Datasets.GetDatasetById(dataArchiverSettings.PowerBiWorkspaceId, report.DatasetId);
result.IsEffectiveIdentityRequired = datasets.IsEffectiveIdentityRequired;
result.IsEffectiveIdentityRolesRequired = datasets.IsEffectiveIdentityRolesRequired;
GenerateTokenRequest tokenRequest;
if (datasets.IsEffectiveIdentityRequired == true)
{
var username = UserHelper.GetCurrentUser();
var roles = _userService.GetRolesForUser(username);
tokenRequest = new GenerateTokenRequest(accessLevel: "view",
identities: new List<EffectiveIdentity>
{
new EffectiveIdentity(username: username,
roles: new List<string> (roles.Select(x=> x.RoleName)),
datasets: new List<string> {datasets.Id})
});
}
else
{
tokenRequest = new GenerateTokenRequest(accessLevel: "view");
}
var tokenResponse =
client.Reports.GenerateTokenInGroup(dataArchiverSettings.PowerBiWorkspaceId, report.Id,
tokenRequest);
if (tokenResponse == null)
{
result.ErrorMessage = "Failed to generate embed token.";
return result;
}
// Generate Embed Configuration.
result.EmbedToken = tokenResponse;
result.EmbedUrl = report.EmbedUrl;
result.Id = report.Id.ToString();
result.WorkloadResourceName = dataArchiverSettings.PowerBiWorkloadResourceName.Trim();
}
}
catch (HttpOperationException exc)
{
result.ErrorMessage =
$"Status: {exc.Response.StatusCode} ({(int)exc.Response.StatusCode})rn" +
$"Response: {exc.Response.Content}rn" +
$"RequestId: {exc.Response.Headers["RequestId"].FirstOrDefault()}";
}
catch (Exception exc)
{
result.ErrorMessage = exc.ToString();
}
return result;
}
最接近"升级指南"的是 Power BI 博客中的公告。看起来您的代码正在使用 v2(例如,reportId 是字符串,而在 v3 中它应该是 Guid(。
以下是更改的简要摘要:
您应该了解的有关 v3 的信息
以下是此版本更新的主要更改:
命名空间重命名:
Microsoft.PowerBI.Api.V2已更改为Microsoft.PowerBI.Api
Microsoft.PowerBI.Api.Extensions.V2已更改为Microsoft.PowerBI.Api.Extensions
Microsoft.PowerBI.Api.V1命名空间已删除。
SetAllConnections 和SetAllConnectionsInGroup操作已弃用并标记为已过时。您应该改用UpdateDatasources或UpdateParametersAPI。
PowerBI 项目 ID 类型已从字符串更改为 Guid,我们建议尽可能使用 Guid。
*数据集 ID 是一个例外,它的键入将保持字符串。
ODataResponse[List[Object]]
类型被更改为Objects
,从而返回响应的对象集合。例如,ODataResponse[列表[报告]] 类型的响应现在将返回报表集合作为返回类型。新的凭据类允许更轻松地构建凭据详细信息。新类包括:
BasicCredentials
、WindowsCredentials
、OAuth2Credentials
等。 阅读配置凭据一文了解详细信息。新的加密帮助程序类,用于在创建凭据详细信息时更轻松地进行加密。 例如,将非对称密钥加密器类与网关公钥一起使用:
GatewayPublicKey publicKey = new GatewayPublicKey
{
Exponent = "...",
Modulus = "..."
};
CredentialsBase credentials = new BasicCredentials("<USER>", "<PASSWORD>");
var credentialsEncryptor = new AsymmetricKeyEncryptor(publicKey);
var credentialDetails = new CredentialDetails(credentials, PrivacyLevel.None, EncryptedConnection.Encrypted, credentialsEncryptor);
阅读配置凭据一文了解详细信息。
- 字段名称的一致性。
例如,reportKey、datasetKey、dashboardKey 和 tileKey 已更改为 reportId、datasetId、dashboardId 和 tileId。
- 操作名称的一致性。
例如,使用 GetDataset 而不是 GetDatasetById。受影响的操作名称是导入、数据集、网关和数据源。
- 对枚举类型使用枚举类而不是字符串。
例如,在 generateTokenRequest 中,我们建议使用
TokenAccessLevel.View
,而不是显式使用 "view" 作为值。
- 必填字段已标记 – 某些字段已更改为必填字段不再可为空。
例子
如果 WorkspaceId 是字符串,则"获取报告"调用中的更改:
VaR 报告 = 等待客户端。Reports.GetReportsInGroupAsync(WorkspaceId(;
VaR 报告 = 等待客户端。Reports.GetReportsInGroupAsync(new Guid(WorkspaceId((;
如果需要字符串,则更改响应处理:
报告= 报告。Value.FirstOrDefault(r => r.Id.Equals(ReportId, StringComparison.InvariantCultureIgnoreCase((;
报告= 报告。Value.FirstOrDefault(r => r.Id.ToString((.Equals(ReportId, StringComparison.InvariantCultureIgnoreCase((;
生成令牌中的更改:
var tokenResponse = await client。Reports.GenerateTokenInGroupAsync(WorkspaceId, report.Id, generateTokenRequestParameters(;
var tokenResponse = await client。Reports.GenerateTokenInGroupAsync(new Guid( WorkspaceId(, report.Id, generateTokenRequestParameters(;
"生成令牌响应处理(如果预期为字符串("中的更改:
m_embedConfig.Id = 报告。同上;
m_embedConfig.Id = 报告。编号.ToString((;
必填字段不可为空,即过期不可为空,应删除 Value 属性:
var minutesToExpiration = EmbedToken.Expiration.值– 日期时间.UtcNow;
var minutesToExpiration = EmbedToken.Expiration – DateTime.UtcNow;
操作名称的一致性,即使用 GetDataset 而不是 GetDatasetById:
VaR 数据集 = 等待客户端。Datasets.GetDatasetById InGroupAsync(WorkspaceId, report.数据集 ID(;
VaR 数据集 = 等待客户端。Datasets.GetDatasetInGroupAsync(new Guid(WorkspaceId(, report.数据集 ID(;