有没有人有关于如何从 PowerBi Embeded v2 升级到 v3 的指南?还是 v3 的教程?



这似乎是一场噩梦,当然很容易将 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操作已弃用并标记为已过时。您应该改用UpdateDatasourcesUpdateParametersAPI。

  • PowerBI 项目 ID 类型已从字符串更改为 Guid,我们建议尽可能使用 Guid。

    *数据集 ID 是一个例外,它的键入将保持字符串。

  • ODataResponse[List[Object]]类型被更改为Objects,从而返回响应的对象集合。例如,ODataResponse[列表[报告]] 类型的响应现在将返回报表集合作为返回类型。

  • 新的凭据类允许更轻松地构建凭据详细信息。新类包括:BasicCredentialsWindowsCredentialsOAuth2Credentials等。 阅读配置凭据一文了解详细信息。

  • 新的加密帮助程序类,用于在创建凭据详细信息时更轻松地进行加密。 例如,将非对称密钥加密器类与网关公钥一起使用:

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

最新更新