sql >> Base de Datos >  >> RDS >> Sqlserver

¿Hay alguna forma de incrustar informes y paneles de power bi en vb.net o en la aplicación de escritorio C# con la base de datos del servidor sql 2008?

¡Si, absolutamente! Como dijo @David Browne en su respuesta, solo es cuestión de cargar algo en un navegador web. En general, no importa cuáles sean sus fuentes de datos:SQL Server o archivos planos, todo es lo mismo. Puede ver cómo se ve en Power BI Embedded Playground.

Tiene dos formas de insertar informes de Power BI (o paneles o mosaicos, es esencialmente lo mismo):

  1. Use Power BI Report Server instalado en las instalaciones. Para incrustar un informe, simplemente agregue un iframe en una página web y establezca su fuente en la URL del informe, pero agregue ?rs:embed=true lo. Sin embargo, Power BI Reporting Server es bastante caro. Necesita una licencia para SQL Server Enterprise con garantía de software o suscripciones de Power BI Premium. La ventaja en este caso podría ser el hecho de que los datos se mantienen en las instalaciones, porque en algunos casos la publicación de datos en la nube podría no estar permitida o ser difícil de certificar y garantizar la privacidad de los datos.

  2. Publique sus informes en el servicio Power BI (es decir, en línea en el sitio web de Power BI). La ventaja de este escenario es su precio. Puede implementar soluciones con una sola cuenta de Power BI Pro, es decir, $ 10 por mes. La desventaja podría ser que sus datos deben ser accesibles para el servicio Power BI (es decir, fuera de su red interna) y es un poco más complejo de integrar.

Cuando incrusta Power BI en su aplicación, hay dos escenarios para elegir:los datos son propiedad del usuario y los datos son propiedad de la aplicación. Con el primero, cada usuario necesita su propia cuenta de Power BI Pro y la usa para ver el informe incrustado. Con el segundo escenario, solo necesita una cuenta "maestra" de Power BI Pro (también es posible incrustarla autenticándose con la entidad de servicio, pero hagámoslo simple por ahora).

No mencionó si su aplicación vb.net es una aplicación web o de escritorio. Aquí hay una muy buena demostración de cómo incrustar Power BI en la aplicación WPF y aquí están las muestras oficiales de Microsoft sobre cómo hacer esto en una aplicación web.

Explicaré con más detalle cómo incrustarlo en una aplicación de escritorio, pero con las aplicaciones web es esencialmente lo mismo.

Primero debe publicar su informe en el servicio Power BI. Será mejor usar un espacio de trabajo dedicado para esto. Asegúrese de que la cuenta Pro, que usará como cuenta "maestra" en su aplicación, tenga derechos para este espacio de trabajo. No es una buena idea usar su cuenta (probablemente de administrador), porque tiene muchos más privilegios de los necesarios. Puede, pero si $ 10 / mes no son un problema, entonces páselos por una cuenta dedicada (o use el principal del servicio).

Entonces necesitas registrar una aplicación. Ingrese un nombre de aplicación descriptivo, establezca el tipo de aplicación como aplicación nativa. Seleccione los permisos que se requerirán para su aplicación, es decir, si solo leerá datos, no le otorgue permisos de "lectura y escritura". O concederlos a todos. Es tu decisión. Registre la aplicación y copie el GUID que obtendrá. Se llama "id de aplicación" o "id de cliente". Lo necesitará más tarde.

El siguiente paso es autenticar su aplicación en Azure AD. Use las bibliotecas de autenticación de Azure Active Directory (ADAL) para esto. Agregue ADAL a su proyecto (por ejemplo, usando NuGet) y use el siguiente código para adquirir un token de acceso (el código está en C#, porque no escribí en vb durante muchos años, pero no debería tener problemas para traducirlo), pero asigne el guid que obtuviste en clientId y proporcione valores para masterAccountName y 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;
}

Al final authenticationResult.AccessToken contendrá el token de acceso que necesitará. Si tiene curiosidad por saber qué hay dentro, vaya a https://jwt.io/ y péguelo para decodificarlo.

Llame a la API REST de Power BI de Get Report In Group para obtener el embedUrl del informe . Use un código como este (usa Newtonsoft.Json), proporcionando groupId real (Id. del espacio de trabajo), reportId (puede obtenerlos de la URL de su informe, cuando se muestra en un navegador web) y 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"];
    }
}

Aquí viene la parte difícil. Necesita el cliente JavaScript de Power BI para usar la URL que obtiene con el código anterior. La forma más fácil es obtener ReportLoader.html , ReportLoader.js y powerbi.js del ejemplo de WPF anterior. Puede leer en detalles sobre estos archivos aquí, pero en general el archivo HTML contiene un <div> vacío , donde se cargará el informe, y llama al código en ReportLoader.js , pasando algunos parámetros (qué informe, token de acceso, tipo de token de acceso, etc.), y llamará al cliente JavaScript de Power BI para que haga el trabajo pesado por usted.

Los parámetros, que pasarás al código del cargador, con un código como este:

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 es un componente de navegador web, en el que carga ReportLoader.html . embedUrl y accessToken son los valores que adquirió antes, el ID del informe, el tipo de elemento incrustado (es un informe, un mosaico o un tablero), el tipo de token de acceso (es AAD, que usamos en este caso, o incrustado) y, por ahora, deje el último vacío (para obtener más detalles al respecto, consulte Detalles de configuración incrustados). La diferencia entre AAD y Embed tokens es que los tokens de inserción son válidos para un elemento en particular (por ejemplo, un informe), mientras que los tokens AAD se pueden usar para autenticarse en muchas llamadas diferentes. Esto significa que es más seguro usar tokens de inserción, ya que solo se pueden usar para insertar este informe en particular y no se pueden usar para realizar otras llamadas a la API de REST. Tenga en cuenta que este token de acceso es visible en el lado del cliente (está en el código JavaScript). Si desea usar tokens de inserción, use el token de AAD en el lado del servidor para llamar a GenerateTokenInGroup, pero esto requiere una capacidad dedicada asignada a este espacio de trabajo (es decir, Power BI Premium o Power BI Embedded) y sin una capacidad, su cuenta Pro tiene capacidad limitada. cantidad de tokens, que puede usar solo para desarrollo.

Después de eso, su informe debería cargarse correctamente en webBrowser .

También le recomendaré que vea este video Uso de la autenticación solo de aplicación con Power BI Embedding con Ted Pattison.