这似乎是一场噩梦,请确保将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})\r\n" +
$"Response: {exc.Response.Content}\r\n" +
$"RequestId: {exc.Response.Headers["RequestId"].FirstOrDefault()}";
}
catch (Exception exc)
{
result.ErrorMessage = exc.ToString();
}
return result;
}
最接近“升级指南”的是the announcement in Power BI blog。看来您的代码正在使用v2(例如,reportId为字符串,而在v3中则为Guid)。
这里是更改的简要摘要:
关于v3的知识
以下是此版本更新的主要更改:
命名空间重命名:
Microsoft.PowerBI.Api.V2更改为Microsoft.PowerBI.Api。>]
- 更改为Microsoft.PowerBI.Api.Extensions]
[Microsoft.PowerBI.Api.Extensions.V2
- 命名空间已删除。
Microsoft.PowerBI.Api.V1
- 和SetAllConnectionsInGroup操作已弃用并标记为过时。您应该改用UpdateDatasources或UpdateParameters API。
SetAllConnections
[PowerBI工件ID的键入方式已从字符串更改为* Guid,我们建议尽可能使用Guid。
*数据集ID是一个例外,它的键入将保留字符串。
ODataResponse[List[Object]]
类型更改为Objects
,因此在响应中返回对象集合。例如,ODataResponse [List [Report]]类型的响应现在将返回Reports集合作为返回类型。新的凭证类使创建credentialDetails更容易。新类包括:
BasicCredentials
,WindowsCredentials
,OAuth2Credentials
等。阅读Configure credentials文章以了解更多信息。新的加密帮助程序类,在创建CredentialDetails时可以更轻松地进行加密。例如,将AsymmetricKeyEncryptor类与网关公共密钥一起使用:
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);
阅读Configure credentials文章以了解更多信息。
- 字段名称的一致性。
例如,将reportKey,datasetKey,dashboardKey和tileKey更改为reportId,datasetId,dashboardId和tileId。
- 操作名称的一致性。
例如,使用GetDataset而不是GetDatasetById。受影响的操作名称是导入,数据集,网关和数据源。
- 对于枚举类型,使用枚举类而不是字符串。
例如,在generateTokenRequest中,我们建议使用
TokenAccessLevel.View
,而不是显式使用“ view”作为值。
- [必填字段已标记-一些字段已更改为必填字段,不能再为空。
示例
如果WorkspaceId是字符串,则更改Get Reports调用:
无功报告=等待client.Reports.GetReportsInGroupAsync(WorkspaceId);
var report = await client.Reports.GetReportsInGroupAsync(new Guid(
WorkspaceId ));如果需要字符串,则更改响应处理:
报告= reports.Value.FirstOrDefault(r => r.Id.Equals(ReportId,StringComparison.InvariantCultureIgnoreCase));
报告= reports.Value.FirstOrDefault(r => r.Id 。ToString()
.Equals(ReportId,StringComparison.InvariantCultureIgnoreCase));更改生成令牌:
var tokenResponse =等待客户端。Reports.GenerateTokenInGroupAsync(WorkspaceId,report.Id,generateTokenRequestParameters);
var tokenResponse =等待客户端。Reports.GenerateTokenInGroupAsync(新Guid(
WorkspaceId ),report.Id,generateTokenRequestParameters);如果需要字符串,请更改生成令牌响应处理:
m_embedConfig.Id = report.Id;
m_embedConfig.Id = report.Id 。ToString()
;必填字段不可为空,即过期不可为空,应删除Value属性:
var minutesToExpiration = EmbedToken.Expiration 。Value
– DateTime.UtcNow;var minutesToExpiration = EmbedToken.Expiration – DateTime.UtcNow;
操作名称的一致性,即使用GetDataset代替GetDatasetById:
var数据集=等待client.Datasets.GetDataset ById
InGroupAsync(WorkspaceId,report.DatasetId);var数据集=等待client.Datasets.GetDatasetInGroupAsync(new Guid(WorkspaceId),report.DatasetId);