![](/img/trans.png)
[英]Microsoft.AnalysisServices.AdomdClient namespace missing Server class?
[英]Microsoft.AnalysisServices.AdomdClient doesn't work in .Net Core application (Authentication issue)
我在 .Net Core Web API 應用程序中使用 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 庫時遇到問題。
有趣的事實:相同的代碼在 .Net 4.7.2 應用程序中運行良好,但在 .Net Core 中失敗(目前我正在測試 .Net 5 版本)。
該應用程序具有 Windows 身份驗證(IIS 快速),並使用連接字符串與 Integrated Security=SSPI 參數的分析服務。 在 connection.Open() 方法上我得到一個
身份驗證異常
“無法使用提供的憑據獲取身份驗證令牌”。 內部異常:“MsalServiceException”:返回 url 的聯合服務
錯誤。
代碼:
Startup.cs
services.AddAuthentication(IISDefaults.AuthenticationScheme);
Controller 私有方法:
private DataTable GetData(string connectionString, string databaseName, string daxQuery,
Dictionary<string, string> parameters)
{
var dt = new DataTable();
using(var conn = new AdomdConnection(connectionString))
{
//fails here
conn.Open();
conn.ChangeDatabase(databaseName);
using(vad cmd = new AdomdCommand(daxQuery, conn))
{
if(parameters.Any())
{
foreach(var param in parameters)
{
cmd.Parameters(param.Key, param.Value);
}
}
using (var adapter = AdomDataAdapter(cmd))
{
adapter.Fill(dt);
}
}
return dt;
}
}
更新:我在控制台應用程序中嘗試過相同的代碼。
.Net 4.7.2 應用程序按預期工作。
.Net 4 失敗並出現不同的錯誤:
AcquireTokenByIntegratedWindowsAuth 不支持在 .net 核心上不添加。WithUserName() 因為 MSAL 無法確定當前登錄用戶的用戶名 (UPN)。 請在調用 ExecuteAsync() 之前使用.WithUserName()。 有關詳細信息,請參閱https://github.com/AzureAD/microsoft-authentication-library-for-do.net/wiki/Integrated-Windows-Authentication
貌似.net核心版無法獲取用戶名,用它來獲取Azure token進行分析服務認證。 此外,如果我使用 MSAL 庫獲取令牌,則不清楚如何將令牌與 AdomdClient 庫一起使用。
我已經寫信給圖書館老板,但沒有得到任何回應。
經過調查,我發現 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 有一些隱藏的依賴關系。 如果將 Microsoft.Identity.Client nuget package 添加到項目中,它會按預期工作。
另一種可能的解決方案 - 不要使用 AdomdClient 並使用 OleDb 連接:
using (var con = new OleDbConnection(connectionString))
{
con.Open();
con.ChangeDatabase(databaseName);
using (var cmd = new OleDbCommand(query, con))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
{
// Here we should increase timeout because DAX query execution can be bigger than default 30 seconds
adapter.SelectCommand.CommandTimeout = _timeoutInSeconds;
adapter.Fill(dt);
}
}
return dt;
}
OleDb 也可以正常工作,您可以毫無問題地查詢表格 model。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.