sql >> Databasteknik >  >> RDS >> Sqlserver

Finns det något sätt att bädda in power bi-rapporter och instrumentpaneler i vb.net- eller C#-skrivbordsapplikationer med sql server 2008-databas?

Ja absolut! Som @David Browne sa i sitt svar, det är bara en fråga om att ladda något i en webbläsare. Generellt sett spelar det ingen roll vilka datakällor du har – SQL Server eller platta filer, det är likadant. Du kan se hur det ser ut i Power BI Embedded Playground.

Du har två sätt att bädda in Power BI-rapporter (eller instrumentpaneler eller brickor, det är i princip samma sak):

  1. Använd Power BI Report Server installerad på plats. För att bädda in en rapport, lägg bara till en iframe till en webbsida och ställ in dess källa till rapportens URL, men lägg till ?rs:embed=true till det. Power BI Reporting Server är dock ganska dyr. Du behöver en licens för SQL Server Enterprise med programvarugaranti eller Power BI Premium-prenumerationer. Fördelen i det här fallet kan vara det faktum att data hålls på plats, eftersom publicering av data till molnet i vissa fall kan vara otillåtet eller svårt att certifiera och garantera datasekretess.

  2. Publicera dina rapporter till Power BI Service (dvs. online till Power BI-webbplatsen). Fördelen med detta scenario är dess pris. Du kan implementera lösningar med ett enda Power BI Pro-konto, det vill säga $10 per månad. Nackdelen kan vara att din data måste vara tillgänglig för Power BI Service (dvs utanför ditt interna nätverk) och att det är lite mer komplicerat att bädda in.

När du bäddar in Power BI i din applikation finns det två scenarier att välja mellan - användaren äger data och appen äger data. Med det första behöver varje användare sitt eget Power BI Pro-konto och använder det för att se den inbäddade rapporten. Med det andra scenariot behöver du bara ett "master" Power BI Pro-konto (det är också möjligt att bädda in det för autentisering med tjänstens principal, men låt oss hålla det enkelt för nu).

Du nämnde inte är din vb.net-applikation webbapp eller skrivbord. Här är en mycket trevlig demo om hur man bäddar in Power BI i WPF-applikationen och här är Microsofts officiella exempel på hur man gör detta i en webbapp.

Jag kommer att förklara mer detaljerat hur man bäddar in det i ett skrivbordsprogram, men med webbappar är det i princip samma sak.

Först måste du publicera din rapport till Power BI Service. Det kommer att vara bättre att använda en dedikerad arbetsyta för detta. Se till att Pro-kontot, som du kommer att använda som "huvudkonto" i din app, har rättigheter för denna arbetsyta. Det är inte en bra idé att använda ditt (förmodligen admin) konto, eftersom det har mycket fler privilegier än vad som behövs. Du kan, men om 10 USD/månad inte är ett problem, använd dem sedan för ett dedikerat konto (eller använd tjänstens principal).

Då behöver du registrera en ansökan. Ange ett beskrivande appnamn, ställ in applikationstypen som Native app. Välj de behörigheter som kommer att krävas för din applikation, d.v.s. om om bara ska läsa data, ge inte "läs- och skrivbehörigheter" till den. Eller ge dem alla. Det är ditt val. Registrera ansökan och kopiera guiden som du kommer att få. Det kallas "app-id" eller "klient-id". Du kommer att behöva det senare.

Nästa steg är att autentisera din app mot Azure AD. Använd Azure Active Directory Authentication Libraries (ADAL) för detta. Lägg till ADAL till din progect (t.ex. genom att använda NuGet) och använd följande kod för att skaffa en åtkomsttoken (koden är i C#, eftersom jag inte skrev i vb på många år, men du borde inte ha några problem med att översätta den), men tilldela guiden som du fick till clientId och ange värden för masterAccountName och 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;
}

I slutet authenticationResult.AccessToken kommer att innehålla åtkomsttoken som du behöver. Om du är nyfiken på vad som finns inuti den, gå till https://jwt.io/ och klistra in den för att få den avkodad.

Anrop Get Report In Group Power BI REST API för att få rapportens embedUrl . Använd kod som denna (den använder Newtonsoft.Json), som ger faktiska groupId (workspaceId), reportId (du kan hämta dem från webbadressen till din rapport, när den visas i en webbläsare) och 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"];
    }
}

Här kommer den knepiga delen. Du behöver Power BI JavaScript-klient för att använda webbadressen som du får med koden ovan. Det enklaste sättet är att skaffa ReportLoader.html , ReportLoader.js och powerbi.js från WPF-provet ovan. Du kan läsa detaljer om dessa filer här, men i allmänhet innehåller HTML-filen en tom <div> , där rapporten kommer att laddas, och du anropar kod i ReportLoader.js , skickar några parametrar (som rapporterar, åtkomsttoken, typ av åtkomsttoken, etc.), och den anropar Power BI JavaScript-klienten för att göra det tunga arbetet åt dig.

Parametrarna, som du kommer att skicka till lastarkoden, med kod så här:

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 är en webbläsarkomponent, i vilken du laddar ReportLoader.html . embedUrl och accessToken är de värden som du förvärvat tidigare, rapportens ID, typ av inbäddningselement (är det rapport, bricka eller instrumentpanel), typ av åtkomsttoken (är det AAD, som vi använde i det här fallet, eller inbäddning) och lämna tills vidare den sista tom (för mer information om det se Inbäddningskonfigurationsdetaljer). Skillnaden mellan AAD och Embed tokens är att inbäddade tokens är giltiga för ett visst element (t.ex. rapport), medan AAD-tokens kan användas för att autentisera dig i många olika samtal. Det betyder att det är säkrare att använda inbäddade tokens, eftersom de bara kan användas för att bädda in just den här rapporten och inte kan användas för att utföra andra REST API-anrop. Tänk på att denna åtkomsttoken är synlig på klientsidan (den finns i JavaScript-koden). Om du vill använda inbäddade tokens, använd sedan AAD-token på serversidan för att anropa GenerateTokenInGroup, men detta kräver en dedikerad kapacitet tilldelad denna arbetsyta (d.v.s. Power BI Premium eller Power BI Embedded) och utan kapacitet har ditt Pro-konto begränsad antal tokens, som du endast kan använda för utveckling.

Efter det bör din rapport laddas in i webBrowser .

Jag rekommenderar också att du tittar på den här videon Använder endast app-autentisering med Power BI Embedding med Ted Pattison.



  1. Är det möjligt att använda `SqlDbType.Structured` för att skicka tabellvärderade parametrar i NHibernate?

  2. Vad är MySQL-motsvarigheten till PostgreSQL:s EXPLAIN ANALYZE

  3. Finns det en Max-funktion i SQL Server som tar två värden som Math.Max ​​i .NET?

  4. Anledning till varför Oracle är skiftlägeskänsligt?