服务主体令牌连接Power BI Service时,ADOMD成功但TOM的Server.Connect()报会话ID不存在的问题咨询
服务主体令牌连接Power BI Service时,ADOMD成功但TOM的Server.Connect()报会话ID不存在的问题咨询
嗨,我来帮你梳理这个问题——你用服务主体令牌连接Power BI PPU的XMLA端点时,ADOMD能顺利建立连接,但TOM的Server.Connect()却抛出“Session ID cannot be found”的错误,这个差异主要是两个库对接Power BI云服务的逻辑不同导致的,咱们一步步拆解:
一、ADOMD和TOM处理令牌与会话的核心差异
- ADOMD的连接逻辑:你写的ADOMD代码里,先构造包含端点和数据集的连接字符串,再设置带过期时间的
AccessToken对象,最后调用Open()。ADOMD专门针对Power BI的XMLA服务做了适配,会把令牌的完整信息(包括过期时间)整合到连接初始化请求里,自动和Power BI服务端建立合法的会话,所以能顺利通过校验。 - TOM的默认连接逻辑:你用的是
Server.Connect(xmlaEndpoint, req.accessToken)这个重载,TOM原本是为本地SQL Server Analysis Services(SSAS)设计的,对接Power BI云服务时,这个直接传字符串令牌的重载并没有正确处理Power BI所需的会话上下文——它没有传递令牌的过期时间,也没有按照Power BI XMLA服务的要求初始化会话,导致服务端无法识别或创建有效的会话,所以抛出了会话ID不存在的错误。
二、权限方面的排查要点
虽然你用的是PPU和服务主体,但还是要确认几个权限细节,避免因权限不匹配间接导致会话问题:
- 确保在Power BI管理门户的“租户设置”里,已经开启了允许服务主体使用XMLA端点的选项;
- 服务主体必须被添加到目标工作区,并且在工作区里的角色是“成员”或“管理员”;
- 检查工作区的XMLA端点设置:如果你的操作涉及写操作,要确保设置为“读/写”;如果是只读场景,也要确认是否开启了“只读”访问权限;
- 服务主体的令牌请求范围是否正确:必须是
https://analysis.windows.net/powerbi/api/.default,这是服务主体调用Power BI XMLA服务的标准范围。
三、解决问题的可行尝试
根据你的场景,推荐你试试这两种调整后的TOM连接方式:
方式1:使用带过期时间的AccessToken对象
和ADOMD的逻辑对齐,构造完整的AccessToken对象(包含过期时间),设置到ConnectionContext后再连接:
string xmlaEndpoint = "powerbi://api.powerbi.com/v1.0/myorg/myworkspace"; var server = new Microsoft.AnalysisServices.Tabular.Server(); DateTimeOffset expiration = DateTimeOffset.Parse(req.accessTokenExpiration); // 构造带过期时间的AccessToken对象 var accessToken = new Microsoft.AnalysisServices.AccessToken(req.accessToken, expiration); server.ConnectionContext.AccessToken = accessToken; // 仅传递端点字符串即可 server.Connect(xmlaEndpoint);
方式2:使用连接字符串+AccessToken的组合
完全复刻ADOMD的连接字符串模式,再设置AccessToken:
string xmlaEndpoint = "powerbi://api.powerbi.com/v1.0/myorg/myworkspace"; string connectionString = $"Data Source={xmlaEndpoint};Catalog={datasetName}"; var server = new Microsoft.AnalysisServices.Tabular.Server(); DateTimeOffset expiration = DateTimeOffset.Parse(req.accessTokenExpiration); server.ConnectionContext.AccessToken = new Microsoft.AnalysisServices.AccessToken(req.accessToken, expiration); server.Connect(connectionString);
四、错误的核心原因
总结来说,“Session ID cannot be found”的本质是:TOM的直接传字符串令牌的重载没有适配Power BI云服务的会话初始化要求,缺少了令牌过期时间这个关键的上下文信息,导致Power BI的XMLA服务无法创建或识别有效的会话。而ADOMD的连接流程已经做了云服务的适配,能完整传递所需的所有会话上下文,所以能成功建立连接。
内容来源于stack exchange
相关产品推荐
相关产品推荐

