Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

C'è un modo per incorporare report e dashboard di Power Bi nell'applicazione desktop vb.net o C# con il database SQL Server 2008?

Si assolutamente! Come ha detto @David Browne nella sua risposta, si tratta solo di caricare qualcosa in un browser web. In genere, non importa quali siano le tue origini dati:SQL Server o file flat, è lo stesso. Puoi vedere come appare in Power BI Embedded Playground.

Hai due modi per incorporare report Power BI (o dashboard o riquadri, è essenzialmente lo stesso):

  1. Utilizzare il server di report di Power BI installato in locale. Per incorporare un rapporto, aggiungi un iframe in una pagina web e impostane l'origine sull'URL del rapporto, ma aggiungi ?rs:embed=true ad esso. Tuttavia, Power BI Reporting Server è piuttosto costoso. È necessaria una licenza per SQL Server Enterprise con garanzia del software o abbonamenti Power BI Premium. Il vantaggio in questo caso potrebbe essere il fatto che i dati vengono mantenuti on-premise, perché in alcuni casi la pubblicazione dei dati sul cloud potrebbe essere vietata o difficile da certificare e garantire la privacy dei dati.

  2. Pubblica i tuoi report nel servizio Power BI (ovvero online sul sito Web di Power BI). Il vantaggio di questo scenario è il suo prezzo. Puoi implementare soluzioni con un unico account Power BI Pro, ovvero $ 10 al mese. Lo svantaggio potrebbe essere che i tuoi dati devono essere accessibili per il servizio Power BI (ovvero al di fuori della tua rete interna) ed è un po' più complesso da incorporare.

Quando si incorpora Power BI nell'applicazione, sono disponibili due scenari tra cui scegliere:l'utente possiede i dati e l'app possiede i dati. Con il primo ogni utente ha bisogno del proprio account Power BI Pro e lo usa per visualizzare il report incorporato. Con il secondo scenario è necessario un solo account Power BI Pro "master" (è anche possibile incorporarlo eseguendo l'autenticazione con l'entità servizio, ma per ora restiamo semplice).

Non hai menzionato la tua app Web o desktop dell'applicazione vb.net. Ecco una bella demo su come incorporare Power BI nell'applicazione WPF e qui ci sono esempi ufficiali di Microsoft su come farlo in un'app Web.

Spiegherò in modo più dettagliato come incorporarlo in un'applicazione desktop, ma con le app Web è essenzialmente lo stesso.

Innanzitutto è necessario pubblicare il report nel servizio Power BI. Sarà meglio utilizzare uno spazio di lavoro dedicato per questo. Assicurati che l'account Pro, che utilizzerai come account "master" nella tua app, disponga dei diritti per questo spazio di lavoro. Non è una buona idea usare il tuo account (probabilmente amministratore), perché ha molti più privilegi del necessario. Puoi, ma se $ 10 al mese non sono un problema, spendili per un account dedicato (o utilizza il principale servizio).

Quindi è necessario registrare un'applicazione. Immettere un nome descrittivo dell'app, impostare il tipo di applicazione su App nativa. Seleziona i permessi che saranno richiesti per la tua applicazione, cioè se se leggerà solo i dati, non concedere i permessi di "lettura e scrittura" ad essa. O concedeteli tutti. È una tua decisione. Registra l'applicazione e copia la guida che riceverai. Si chiama "app id" o "client id". Ne avrai bisogno in seguito.

Il passaggio successivo consiste nell'autenticare l'app in Azure AD. Usare le librerie di autenticazione di Azure Active Directory (ADAL) per questo. Aggiungi ADAL al tuo progetto (es. usando NuGet) e usa il codice seguente per acquisire un token di accesso (il codice è in C#, perché non scrivevo in vb da molti anni, ma non dovresti avere problemi a tradurlo), ma assegna il guid che hai a clientId e fornisci i valori per masterAccountName e 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;
}

Alla fine authenticationResult.AccessToken conterrà il token di accesso di cui avrai bisogno. Se sei curioso di sapere cosa contiene, vai su https://jwt.io/ e incollalo per decodificarlo.

Chiama l'API REST di Power BI di gruppo per ottenere embedUrl del rapporto . Usa codice come questo (usa Newtonsoft.Json), fornendo groupId effettivo (workspaceId), reportId (puoi ottenerli dall'URL del tuo rapporto, quando è mostrato in un browser web) e 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"];
    }
}

Qui arriva la parte difficile. È necessario il client JavaScript Power BI per usare l'URL ottenuto con il codice sopra. Il modo più semplice è ottenere ReportLoader.html , ReportLoader.js e powerbi.js dall'esempio WPF sopra. Puoi leggere i dettagli su questi file qui, ma in generale il file HTML contiene un <div> vuoto , dove verrà caricato il rapporto e chiami il codice in ReportLoader.js , passando alcuni parametri (quali report, token di accesso, tipo di token di accesso e così via) e chiamerà il client JavaScript Power BI per eseguire il lavoro pesante per te.

I parametri, che passerai al codice del caricatore, con codice come questo:

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 è un componente del browser web, in cui carichi ReportLoader.html . embedUrl e accessToken sono i valori che hai acquisito prima, l'ID del report, il tipo di elemento embed (è report, tile o dashboard), il tipo di token di accesso (è AAD, che abbiamo usato in questo caso, o embed) e per ora lascia l'ultimo vuoto (per maggiori dettagli, vedere Dettagli di configurazione incorporati). La differenza tra AAD e Embed token è che i token incorporati sono validi per un particolare elemento (ad es. report), mentre i token AAD possono essere utilizzati per autenticarsi in molte chiamate diverse. Ciò significa che è più sicuro usare i token di incorporamento, perché possono essere usati solo per incorporare questo particolare report e non possono essere usati per eseguire altre chiamate API REST. Tieni presente che questo token di accesso è visibile sul lato client (è nel codice JavaScript). Se desideri utilizzare i token di incorporamento, usa il token AAD sul lato server per chiamare GenerateTokenInGroup, ma ciò richiede una capacità dedicata assegnata a questo spazio di lavoro (ad esempio Power BI Premium o Power BI Embedded) e senza una capacità, il tuo account Pro ha un limite numero di token, che puoi utilizzare solo per lo sviluppo.

Dopodiché, il tuo rapporto dovrebbe essere caricato correttamente in webBrowser .

Ti consiglierò anche di guardare questo video Utilizzo dell'autenticazione solo app con Power BI Embedding con Ted Pattison.