.NET PowerBIClient NuGet包错误追加相对URI导致本地服务调用失败
PowerBI Client NuGet包调用本地报表服务器时自动追加错误路径问题
问题描述
- 使用微软官方
PowerBI ClientNuGet包封装本地(on-premise)部署的Power BI报表服务器REST API时,遇到请求URI被错误追加固定相对路径的问题。 - 本地报表服务器REST API的基础地址为
https://niceReportingURL.com/reports/api/v2.0,但NuGet包会在传入的基础地址后额外追加不必要的/v1.0/myorg路径。 - 路径拼接后最终生成的错误请求URI为
https://niceReportingURL.com/reports/api/v2.0/v1.0/myorg,不符合本地服务的接口路径规则,直接导致请求失败。 - 查阅
ReportsOperations类源码确认,这段异常的相对URI是硬编码在逻辑中的,对应代码片段如下:
string uriString = new Uri(new Uri(absoluteUri + (absoluteUri.EndsWith("/") ? "" : "/")), "v1.0/myorg/reports").ToString();
注:示例URI中省略了
/Reports后缀,该路径拼接问题属于包的通用逻辑问题,并非单个接口特例。
- 复现问题的测试请求代码如下:
var c = new BasicAuthenticationCredentials { UserName = "reportingUser", Password = "secretReportingPW" }; var client = new PowerBIClient(new Uri("https://niceReportingURL.com/reports/api/v2.0"), c); var result = await client.Reports.GetReportsAsync().ConfigureAwait(false); // 此处调用报错
核心诉求:是否存在相关配置项或可行的变通方案(workaround),阻止该NuGet包自动追加这段错误的相对URI?
解决方法
Microsoft.PowerBI.Api包本身是为Power BI公有云服务设计的,硬编码的/v1.0/myorg是云服务的固定路径前缀,包内没有提供任何可配置项修改或关闭这段路径拼接逻辑,针对本地Power BI报表服务器场景,可采用以下两种方案:
- 方案1:自定义HttpMessageHandler拦截请求重写URI
初始化PowerBIClient时传入自定义的消息处理器,在请求发送前替换掉错误拼接的路径段,不需要修改第三方包源码,接入简单。示例实现:public class PowerBiOnPremUriRewriteHandler : DelegatingHandler { public PowerBiOnPremUriRewriteHandler() { InnerHandler = new HttpClientHandler(); } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { const string wrongPathSegment = "/v1.0/myorg/"; if (request.RequestUri != null && request.RequestUri.AbsoluteUri.Contains(wrongPathSegment)) { var correctedUri = new Uri(request.RequestUri.AbsoluteUri.Replace(wrongPathSegment, "/")); request.RequestUri = correctedUri; } return await base.SendAsync(request, cancellationToken).ConfigureAwait(false); } } // 客户端初始化代码 var credentials = new BasicAuthenticationCredentials { UserName = "reportingUser", Password = "secretReportingPW" }; var baseAddress = new Uri("https://niceReportingURL.com/reports/api/v2.0"); using var client = new PowerBIClient(baseAddress, credentials, new PowerBiOnPremUriRewriteHandler()); // 调用接口不再报路径错误 var result = await client.Reports.GetReportsAsync().ConfigureAwait(false); - 方案2:直接封装HTTP请求调用本地API
本地Power BI报表服务器的API模型、路径规则和公有云服务存在不少差异,如果后续调用其他接口出现参数不匹配、模型不兼容的问题,更稳妥的方式是直接使用HttpClient手写对应接口的请求逻辑,完全绕开SDK的硬编码限制。
内容的提问来源于stack exchange,提问作者Robin Kaltenbach
相关产品推荐
相关产品推荐

