Phải, chắc chắn rồi! Như @David Browne đã nói trong phản hồi của mình, vấn đề chỉ là tải một thứ gì đó trong trình duyệt web. Nói chung, không quan trọng nguồn dữ liệu của bạn là gì - SQL Server hay tệp phẳng, tất cả đều giống nhau. Bạn có thể thấy nó trông như thế nào trong Sân chơi nhúng Power BI.
Bạn có hai cách để nhúng báo cáo Power BI (hoặc bảng điều khiển hoặc ô, về cơ bản nó giống nhau):
-
Sử dụng Máy chủ Báo cáo Power BI được cài đặt trên cơ sở. Để nhúng báo cáo, chỉ cần thêm
iframe
vào một trang web và đặt nguồn đó thành URL của báo cáo, nhưng thêm?rs:embed=true
với nó. Tuy nhiên, Power BI Reporting Server có giá khá cao. Bạn cần có giấy phép cho SQL Server Enterprise với bảo đảm phần mềm hoặc đăng ký Power BI Premium. Lợi thế trong trường hợp này có thể là thực tế, dữ liệu được lưu giữ tại chỗ, vì trong một số trường hợp, việc xuất bản dữ liệu lên đám mây có thể không được phép hoặc khó xác nhận và đảm bảo quyền riêng tư của dữ liệu. -
Xuất bản các báo cáo của bạn lên Dịch vụ Power BI (tức là trực tuyến lên trang web Power BI). Ưu điểm của kịch bản này là giá của nó. Bạn có thể triển khai các giải pháp với một tài khoản Power BI Pro duy nhất, tức là $ 10 mỗi tháng. Điểm bất lợi có thể là dữ liệu của bạn phải có thể truy cập được đối với Dịch vụ Power BI (tức là bên ngoài mạng nội bộ của bạn) và việc nhúng phức tạp hơn một chút.
Khi bạn nhúng Power BI vào ứng dụng của mình, có hai tình huống để bạn lựa chọn - người dùng sở hữu dữ liệu và ứng dụng sở hữu dữ liệu. Với tài khoản đầu tiên, mỗi người dùng cần có tài khoản Power BI Pro của riêng mình và sử dụng tài khoản đó để xem báo cáo được nhúng. Với trường hợp thứ hai, bạn chỉ cần một tài khoản Power BI Pro "chính" (cũng có thể nhúng tài khoản này xác thực với dịch vụ chính, nhưng hãy giữ cho nó đơn giản ngay bây giờ).
Bạn không đề cập đến bạn là ứng dụng web ứng dụng vb.net hay máy tính để bàn. Đây là một bản trình diễn rất hay về cách nhúng Power BI vào ứng dụng WPF và đây là các mẫu chính thức của Microsoft về cách thực hiện việc này trong một ứng dụng web.
Tôi sẽ giải thích chi tiết hơn về cách nhúng nó vào ứng dụng máy tính để bàn, nhưng với các ứng dụng web về cơ bản thì giống nhau.
Trước tiên, bạn cần xuất bản báo cáo của mình lên Dịch vụ Power BI. Sẽ tốt hơn nếu sử dụng một không gian làm việc chuyên dụng cho việc này. Đảm bảo rằng tài khoản Pro, mà bạn sẽ sử dụng làm tài khoản "chính" trong ứng dụng của mình, có quyền đối với không gian làm việc này. Bạn không nên sử dụng tài khoản (có thể là quản trị viên) của mình, vì tài khoản này có nhiều đặc quyền hơn mức cần thiết. Bạn có thể, nhưng nếu 10 đô la / tháng không phải là một vấn đề, thì hãy chi tiêu chúng cho một tài khoản chuyên dụng (hoặc sử dụng tiền gốc của dịch vụ).
Sau đó, bạn cần phải đăng ký một ứng dụng. Nhập một số tên ứng dụng mô tả, đặt loại ứng dụng thành Ứng dụng gốc. Chọn các quyền sẽ được yêu cầu cho ứng dụng của bạn, tức là nếu chỉ đọc dữ liệu, đừng cấp quyền "đọc và ghi" cho ứng dụng đó. Hoặc cấp tất cả. Đó là quyết định của bạn. Đăng ký ứng dụng và sao chép hướng dẫn mà bạn sẽ nhận được. Nó được gọi là "id ứng dụng" hoặc "id khách hàng". Bạn sẽ cần nó sau.
Bước tiếp theo là xác thực ứng dụng của bạn với Azure AD. Sử dụng Azure Active Directory Authentication Libraries (ADAL) cho việc này. Thêm ADAL vào tổ chức của bạn (ví dụ:sử dụng NuGet) và sử dụng mã sau để lấy mã thông báo truy cập (mã này bằng C #, vì tôi đã không viết bằng vb trong nhiều năm, nhưng bạn sẽ không gặp vấn đề gì khi dịch nó), nhưng hãy gán hướng dẫn mà bạn có để clientId
và cung cấp các giá trị cho masterAccountName
và masterAccountPassword
:
using Microsoft.IdentityModel.Clients.ActiveDirectory;
private static string redirectUri = "https://login.live.com/oauth20_desktop.srf";
private static string resourceUri = "https://analysis.windows.net/powerbi/api";
private static string authorityUri = "https://login.windows.net/common/oauth2/authorize";
private static string clientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
private static AuthenticationContext authContext = new AuthenticationContext(authorityUri, new TokenCache());
// First check is there token in the cache
try
{
authenticationResult = authContext.AcquireTokenSilentAsync(resourceUri, clientId).Result;
}
catch (AggregateException ex)
{
AdalException ex2 = ex.InnerException as AdalException;
if ((ex2 == null) || (ex2 != null && ex2.ErrorCode != "failed_to_acquire_token_silently"))
{
throw new ApplicationException(ex.Message);
}
}
if (authenticationResult == null)
{
var uc = new UserPasswordCredential(masterAccountName, masterAccountPassword);
authenticationResult = authContext.AcquireTokenAsync(resourceUri, clientId, uc).Result;
}
Ở cuối authenticationResult.AccessToken
sẽ chứa mã thông báo truy cập mà bạn cần. Nếu bạn tò mò không biết có gì bên trong nó, hãy truy cập https://jwt.io/ và dán nó vào để giải mã.
Gọi Nhận Báo cáo trong Nhóm API REST Power BI để lấy embedUrl
của báo cáo . Sử dụng mã như thế này (nó sử dụng Newtonsoft.Json), cung cấp groupId
thực tế (workspaceId), reportId
(bạn có thể lấy chúng từ URL của báo cáo khi nó được hiển thị trong trình duyệt web) và accessToken
:
string powerBIDatasetsApiUrl = $"https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}";
var request = WebRequest.Create(powerBIDatasetsApiUrl) as HttpWebRequest;
request.KeepAlive = true;
request.Method = "GET";
request.ContentLength = 0;
request.ContentType = "application/json";
request.Headers.Add("Authorization", $"Bearer {accessToken}");
using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
{
using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
{
string responseContent = reader.ReadToEnd();
var responseJson = JsonConvert.DeserializeObject<dynamic>(responseContent);
return responseJson["embedUrl"];
}
}
Đây là phần khó khăn. Bạn cần ứng dụng JavaScript Power BI để sử dụng url mà bạn nhận được với mã ở trên. Cách dễ nhất là lấy ReportLoader.html
, ReportLoader.js
và powerbi.js
từ mẫu WPF ở trên. Bạn có thể đọc chi tiết về các tệp này tại đây, nhưng nói chung tệp HTML chứa <div>
trống , nơi báo cáo sẽ được tải và bạn gọi mã trong ReportLoader.js
, chuyển một số tham số (báo cáo nào, mã thông báo truy cập, loại mã thông báo truy cập, v.v.) và nó sẽ gọi ứng dụng JavaScript Power BI để thực hiện công việc nặng nhọc cho bạn.
Các tham số mà bạn sẽ chuyển đến mã trình tải, với mã như sau:
var parameters = new object[] { embedUrl, accessToken, reportId, "report" /* or "dashboard" or "tile"*/, 0 /* 0 - AAD, 1 - Embed */, string.Empty };
webBrowser.Document.InvokeScript("LoadEmbeddedObject", parameters);
webBrowser
là một thành phần của trình duyệt web, trong đó bạn tải ReportLoader.html
. embedUrl
và accessToken
là các giá trị mà bạn đã có được trước đây, ID của báo cáo, loại phần tử nhúng (đó là báo cáo, ô hay trang tổng quan), loại mã thông báo truy cập (có phải là AAD, chúng tôi đã sử dụng trong trường hợp này hay đã nhúng) và bây giờ để lại cuối cùng trống (để biết thêm chi tiết về điều đó, hãy xem Chi tiết cấu hình nhúng). Sự khác biệt giữa AAD
và Embed
mã thông báo là mã thông báo nhúng hợp lệ cho phần tử cụ thể (ví dụ:báo cáo), trong khi mã thông báo AAD có thể được sử dụng để xác thực chính bạn trong nhiều lệnh gọi khác nhau. Điều này có nghĩa là sử dụng mã thông báo nhúng sẽ an toàn hơn vì chúng chỉ có thể được sử dụng để nhúng báo cáo cụ thể này và không thể được sử dụng để thực hiện các lệnh gọi API REST khác. Hãy nhớ rằng mã thông báo truy cập này có thể nhìn thấy ở phía máy khách (mã này ở trong mã JavaScript). Nếu bạn muốn sử dụng mã thông báo nhúng, hãy sử dụng mã thông báo AAD ở phía máy chủ để gọi GenerateTokenInGroup, nhưng điều này yêu cầu dung lượng chuyên dụng được chỉ định cho không gian làm việc này (tức là Power BI Premium hoặc Power BI Embedded) và nếu không có dung lượng, tài khoản Pro của bạn bị giới hạn số lượng mã thông báo mà bạn chỉ có thể sử dụng để phát triển.
Sau đó, báo cáo của bạn sẽ được tải thành công vào webBrowser
.
Tôi cũng sẽ khuyên bạn nên xem video này Sử dụng Xác thực chỉ ứng dụng với Nhúng Power BI với Ted Pattison.