Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt es eine Möglichkeit, Power Bi-Berichte und Dashboards in vb.net oder eine C#-Desktopanwendung mit einer SQL Server 2008-Datenbank einzubetten?

Ja absolut! Wie @David Browne in seiner Antwort sagte, geht es nur darum, etwas in einen Webbrowser zu laden. Im Allgemeinen spielt es keine Rolle, was Ihre Datenquellen sind – SQL Server oder Flatfiles, es ist alles dasselbe. Sie können sehen, wie es in Power BI Embedded Playground aussieht.

Sie haben zwei Möglichkeiten zum Einbetten von Power BI-Berichten (oder Dashboards oder Kacheln, es ist im Wesentlichen dasselbe):

  1. Verwenden Sie den lokal installierten Power BI-Berichtsserver. Um einen Bericht einzubetten, fügen Sie einfach einen iframe hinzu in eine Webseite und legen Sie als Quelle die URL des Berichts fest, aber fügen Sie ?rs:embed=true hinzu dazu. Power BI Reporting Server ist jedoch ziemlich teuer. Sie benötigen eine Lizenz für SQL Server Enterprise mit Software Assurance oder Power BI Premium-Abonnements. Vorteil in diesem Fall könnte die Tatsache sein, dass die Daten vor Ort aufbewahrt werden, da die Veröffentlichung von Daten in der Cloud in einigen Fällen untersagt oder schwierig zu zertifizieren und der Datenschutz zu gewährleisten sein könnte.

  2. Veröffentlichen Sie Ihre Berichte im Power BI-Dienst (d. h. online auf der Power BI-Website). Der Vorteil dieses Szenarios ist sein Preis. Sie können Lösungen mit einem einzigen Power BI Pro-Konto implementieren, d. h. 10 US-Dollar pro Monat. Der Nachteil könnte sein, dass Ihre Daten für den Power BI-Dienst zugänglich sein müssen (d. h. außerhalb Ihres internen Netzwerks) und die Einbettung etwas komplexer ist.

Wenn Sie Power BI in Ihre Anwendung einbetten, stehen zwei Szenarien zur Auswahl:Benutzer besitzt Daten und App besitzt Daten. Bei der ersten benötigt jeder Benutzer ein eigenes Power BI Pro-Konto und verwendet es, um den eingebetteten Bericht anzuzeigen. Beim zweiten Szenario benötigen Sie nur ein „Master“-Power BI Pro-Konto (es ist auch möglich, die Authentifizierung mit dem Dienstprinzipal einzubetten, aber lassen Sie es uns vorerst einfach halten).

Sie haben nicht erwähnt, ob Sie eine vb.net-Anwendungswebanwendung oder einen Desktop verwenden. Hier ist eine sehr schöne Demo, wie man Power BI in eine WPF-Anwendung einbettet, und hier sind die offiziellen Beispiele von Microsoft, wie man das in einer Web-App macht.

Ich werde detaillierter erklären, wie man es in eine Desktop-Anwendung einbettet, aber bei Web-Apps ist es im Wesentlichen dasselbe.

Zuerst müssen Sie Ihren Bericht im Power BI-Dienst veröffentlichen. Es ist besser, dafür einen dedizierten Arbeitsbereich zu verwenden. Stellen Sie sicher, dass das Pro-Konto, das Sie als "Master"-Konto in Ihrer App verwenden, über Rechte für diesen Arbeitsbereich verfügt. Es ist keine gute Idee, Ihr (wahrscheinlich Admin-) Konto zu verwenden, da es viel mehr Berechtigungen als nötig hat. Sie können, aber wenn $10/Monat kein Problem darstellen, geben Sie sie für ein dediziertes Konto aus (oder verwenden Sie den Dienstprinzipal).

Dann müssen Sie eine Anwendung registrieren. Geben Sie einen beschreibenden App-Namen ein und stellen Sie den Anwendungstyp auf Native App ein. Wählen Sie die Berechtigungen aus, die für Ihre Anwendung erforderlich sind, d. h. wenn sie nur Daten lesen wird, erteilen Sie ihr keine „Lese- und Schreibberechtigungen“. Oder gewähren Sie ihnen alle. Es ist Ihre Entscheidung. Registrieren Sie die Anwendung und kopieren Sie die Anleitung, die Sie erhalten. Sie heißt „App-ID“ oder „Client-ID“. Sie werden es später brauchen.

Der nächste Schritt besteht darin, Ihre App bei Azure AD zu authentifizieren. Verwenden Sie dafür Azure Active Directory Authentication Libraries (ADAL). Fügen Sie Ihrem Projekt ADAL hinzu (z. B. mit NuGet) und verwenden Sie den folgenden Code, um ein Zugriffstoken zu erwerben (der Code ist in C#, weil ich viele Jahre lang nicht in vb geschrieben habe, aber Sie sollten keine Probleme beim Übersetzen haben), aber zuweisen die Guid, die Sie zu clientId bekommen haben und geben Sie Werte für masterAccountName an und 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;
}

Am Ende authenticationResult.AccessToken enthält das benötigte Zugriffstoken. Wenn Sie neugierig sind, was darin enthalten ist, gehen Sie zu https://jwt.io/ und fügen Sie es ein, um es entschlüsseln zu lassen.

Rufen Sie Get Report In Group Power BI REST API auf, um die embedUrl des Berichts abzurufen . Verwenden Sie Code wie diesen (er verwendet Newtonsoft.Json) und geben Sie die tatsächliche groupId an (workspaceId), reportId (Sie können sie von der URL Ihres Berichts abrufen, wenn er in einem Webbrowser angezeigt wird) und 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"];
    }
}

Hier kommt der heikle Teil. Sie benötigen den Power BI-JavaScript-Client, um die URL zu verwenden, die Sie mit dem obigen Code erhalten. Am einfachsten ist es, sich ReportLoader.html zu besorgen , ReportLoader.js und powerbi.js aus dem obigen WPF-Beispiel. Einzelheiten zu diesen Dateien können Sie hier nachlesen, aber im Allgemeinen enthält die HTML-Datei einen leeren <div> , wo der Bericht geladen wird, und Sie rufen den Code in ReportLoader.js auf , übergibt einige Parameter (welcher Bericht, Zugriffstoken, Zugriffstokentyp usw.) und ruft den Power BI-JavaScript-Client auf, um die schwere Arbeit für Sie zu erledigen.

Die Parameter, die Sie an den Loader-Code übergeben, mit Code wie diesem:

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 ist eine Webbrowser-Komponente, in der Sie ReportLoader.html laden . embedUrl und accessToken sind die Werte, die Sie zuvor erfasst haben, die ID des Berichts, der Typ des eingebetteten Elements (ist es Bericht, Kachel oder Dashboard), der Typ des Zugriffstokens (ist es AAD, das wir in diesem Fall verwendet haben, oder eingebettet) und verlassen Sie es vorerst die letzte ist leer (weitere Details dazu finden Sie unter Konfigurationsdetails einbetten). Der Unterschied zwischen AAD und Embed Tokens ist, dass eingebettete Tokens für ein bestimmtes Element (z. B. Bericht) gültig sind, während AAD-Tokens verwendet werden können, um sich in vielen verschiedenen Aufrufen zu authentifizieren. Dies bedeutet, dass es sicherer ist, Einbettungstoken zu verwenden, da sie nur zum Einbetten dieses bestimmten Berichts und nicht zum Ausführen anderer REST-API-Aufrufe verwendet werden können. Beachten Sie, dass dieses Zugriffstoken auf der Clientseite sichtbar ist (es befindet sich im JavaScript-Code). Wenn Sie eingebettete Token verwenden möchten, verwenden Sie das AAD-Token auf der Serverseite, um GenerateTokenInGroup aufzurufen, aber dies erfordert eine dedizierte Kapazität, die diesem Arbeitsbereich zugewiesen ist (z. B. Power BI Premium oder Power BI Embedded), und ohne Kapazität ist Ihr Pro-Konto begrenzt Anzahl Token, die Sie nur für die Entwicklung verwenden können.

Danach sollte Ihr Bericht erfolgreich in webBrowser geladen werden .

Ich empfehle Ihnen außerdem, sich dieses Video „Using App-only Authentication with Power BI Embedding“ mit Ted Pattison anzusehen.