Ja absolut! Som @David Browne sagde i sit svar, er det bare et spørgsmål om at indlæse noget i en webbrowser. Generelt er det lige meget, hvad dine datakilder er - SQL Server eller flade filer, det er det samme. Du kan se, hvordan det ser ud i Power BI Embedded Playground.
Du har to måder at indlejre Power BI-rapporter på (eller dashboards eller fliser, det er stort set det samme):
-
Brug Power BI Report Server installeret på stedet. For at integrere en rapport skal du blot tilføje en
iframe
ind på en webside og indstil dens kilde til rapportens URL, men tilføj?rs:embed=true
til det. Power BI Reporting Server er dog ret dyr. Du skal bruge en licens til SQL Server Enterprise med softwareforsikring eller Power BI Premium-abonnementer. Fordelen i dette tilfælde kan være det faktum, at dataene opbevares på stedet, fordi publicering af data til skyen i nogle tilfælde kan være forbudt eller vanskeligt at certificere og garantere databeskyttelse. -
Udgiv dine rapporter til Power BI Service (dvs. online til Power BI-webstedet). Fordelen ved dette scenario er prisen. Du kan implementere løsninger med en enkelt Power BI Pro-konto, dvs. $10 pr. måned. Ulempen kan være, at dine data skal være tilgængelige for Power BI Service (dvs. uden for dit interne netværk), og det er lidt mere komplekst at integrere.
Når du integrerer Power BI i din applikation, er der to scenarier at vælge imellem - bruger ejer data og app ejer data. Med den første skal hver bruger have sin egen Power BI Pro-konto og bruger den til at se den indlejrede rapport. Med det andet scenarie har du kun brug for én "master" Power BI Pro-konto (det er også muligt at integrere den med godkendelse med serviceprincipal, men lad os holde det enkelt indtil videre).
Du nævnte ikke, om din vb.net-applikation webapp eller desktop. Her er en meget flot demo, hvordan man indlejrer Power BI i WPF-applikationen, og her er Microsofts officielle eksempler på, hvordan man gør dette i en web-app.
Jeg vil forklare mere detaljeret, hvordan man indlejrer det i en desktop-applikation, men med web-apps er det i det væsentlige det samme.
Først skal du udgive din rapport til Power BI Service. Det vil være bedre at bruge et dedikeret arbejdsområde til dette. Sørg for, at Pro-kontoen, som du vil bruge som "master"-konto i din app, har rettigheder til dette arbejdsområde. Det er ikke en god idé at bruge din (sandsynligvis admin) konto, fordi den har langt flere privilegier end nødvendigt. Det kan du, men hvis 10 USD/måned ikke er et problem, så brug dem på en dedikeret konto (eller brug serviceprincipal).
Så skal du registrere en ansøgning. Indtast et beskrivende appnavn, indstil applikationstypen til at være Native app. Vælg de tilladelser, der kræves til din ansøgning, dvs. hvis hvis kun vil læse data, skal du ikke give "læse og skrive" tilladelser til den. Eller give dem alle. Det er din beslutning. Registrer ansøgningen og kopier den guide, du får. Det kaldes "app-id" eller "klient-id". Du får brug for det senere.
Det næste trin er at godkende din app mod Azure AD. Brug Azure Active Directory Authentication Libraries (ADAL) til dette. Tilføj ADAL til din progect (f.eks. ved hjælp af NuGet) og brug følgende kode til at erhverve et adgangstoken (koden er i C#, fordi jeg ikke har skrevet i vb i mange år, men du skulle ikke have nogen problemer med at oversætte det), men tildel den guide, du fik til clientId
og angiv værdier for masterAccountName
og 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;
}
Til sidst authenticationResult.AccessToken
vil indeholde det adgangstoken, som du skal bruge. Hvis du er nysgerrig efter, hvad der er inde i den, så gå til https://jwt.io/ og indsæt den for at få den afkodet.
Kald Hent rapport i gruppe Power BI REST API for at få rapportens embedUrl
. Brug kode som denne (den bruger Newtonsoft.Json), som giver det faktiske groupId
(workspaceId), reportId
(du kan hente dem fra URL'en til din rapport, når den vises i en webbrowser) og 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"];
}
}
Her kommer den vanskelige del. Du skal bruge Power BI JavaScript-klient for at bruge den url, som du får med koden ovenfor. Den nemmeste måde er at få ReportLoader.html
, ReportLoader.js
og powerbi.js
fra WPF-prøven ovenfor. Du kan læse detaljer om disse filer her, men generelt indeholder HTML-filen en tom <div>
, hvor rapporten vil blive indlæst, og du kalder kode i ReportLoader.js
, ved at sende nogle parametre (som rapporterer, adgangstoken, adgangstokentype osv.), og den kalder Power BI JavaScript-klienten til at gøre det tunge løft for dig.
Parametrene, som du vil videregive til loader-koden, med kode som denne:
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
er en webbrowserkomponent, hvor du indlæser ReportLoader.html
. embedUrl
og accessToken
er de værdier, som du har erhvervet før, rapportens ID, indlejringselementtype (er det rapport, flise eller dashboard), adgangstokentype (er det AAD, som vi brugte i dette tilfælde, eller indlejring) og forlad nu den sidste tom (for flere detaljer om det, se Indlejringskonfigurationsdetaljer). Forskellen mellem AAD
og Embed
tokens er, at indlejrede tokens er gyldige for et bestemt element (f.eks. rapport), mens AAD-tokens kan bruges til at autentificere dig selv i mange forskellige opkald. Det betyder, at det er mere sikkert at bruge embed-tokens, fordi de kun kan bruges til at indlejre denne særlige rapport og ikke kan bruges til at udføre andre REST API-kald. Husk, at dette adgangstoken er synligt på klientsiden (det er i JavaScript-koden). Hvis du vil bruge embed-tokens, skal du bruge AAD-tokenet på serversiden til at kalde GenerateTokenInGroup, men dette kræver en dedikeret kapacitet, der er tildelt dette arbejdsområde (dvs. Power BI Premium eller Power BI Embedded), og uden en kapacitet er din Pro-konto begrænset antal tokens, som du kun kan bruge til udvikling.
Derefter skulle din rapport blive indlæst i webBrowser
.
Jeg vil også anbefale dig at se denne video Brug af app-only-godkendelse med Power BI Embedding med Ted Pattison.