C# 在Xamarin.Forms应用程序中嵌入PowerBI报告

C# 在Xamarin.Forms应用程序中嵌入PowerBI报告,c#,xamarin,xamarin.forms,powerbi,access-token,C#,Xamarin,Xamarin.forms,Powerbi,Access Token,你好。我在Xamarin.Forms应用程序中显示PowerBi报告时遇到问题(这里是PBI的新手)。我只需要查看报告,不需要编辑内容。我得到了访问令牌,之后我做了一个GET请求,并从PowerBi获得了嵌入的url,我在WebView.Source中使用了该url来显示在屏幕上。它加载到那个报告,但它说我并没有权限查看我应该拥有的报告(我用于令牌的用户是PBI PRO用户)。我得到的文本是“要查看此报告,请作者访问”。这是邮政编码 string url = "https://logi

你好。我在Xamarin.Forms应用程序中显示PowerBi报告时遇到问题(这里是PBI的新手)。我只需要查看报告,不需要编辑内容。我得到了访问令牌,之后我做了一个GET请求,并从PowerBi获得了嵌入的url,我在WebView.Source中使用了该url来显示在屏幕上。它加载到那个报告,但它说我并没有权限查看我应该拥有的报告(我用于令牌的用户是PBI PRO用户)。我得到的文本是“要查看此报告,请作者访问”。这是邮政编码

string url = "https://login.microsoftonline.com/<pbi_tenant_id>/oauth2/token";

                    IEnumerable<KeyValuePair<string, string>> parameters = new List<KeyValuePair<string, string>>()
                    {
                        new KeyValuePair<string, string>("name",            "testName"),
                        new KeyValuePair<string, string>("grant_type",      "password"),
                        new KeyValuePair<string, string>("scope",           "openid"),
                        new KeyValuePair<string, string>("resource",        "https://analysis.windows.net/powerbi/api"),
                        new KeyValuePair<string, string>("client_id",       "<client_id>"),
                        new KeyValuePair<string, string>("username",        "<pro_user>"),
                        new KeyValuePair<string, string>("password",        "<password>"),
                        new KeyValuePair<string, string>("client_secret",   "<client_secret>")
                        };
HttpContent content = new FormUrlEncodedContent(parameters);
stringurl=”https://login.microsoftonline.com//oauth2/token";
IEnumerable参数=新列表()
{
新的KeyValuePair(“名称”、“测试名称”),
新的KeyValuePair(“授权类型”、“密码”),
新的KeyValuePair(“范围”、“openid”),
新的KeyValuePair(“资源”https://analysis.windows.net/powerbi/api"),
新的KeyValuePair(“客户机id”,”),
新的KeyValuePair(“用户名”和“”),
新的KeyValuePair(“密码”和“”),
新的KeyValuePair(“客户机密钥”),“”)
};
HttpContent=新FormUrlEncodedContent(参数);
在所有这些之后,我得到了我的令牌,并用该令牌发出了GET请求以获取嵌入的url

using (HttpResponseMessage response = await client.PostAsync(url, content))
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            using (HttpContent contentOfReponse = response.Content)
                            {
                                try
                                {
                                    string tokenResponseJSON = await contentOfReponse.ReadAsStringAsync(); //token in json format that I needed to convert to string in next line
                                    var tokenRepsonse = JsonConvert.DeserializeObject<TokenInfoModel>(tokenResponseJSON);

                                    string accessToken = tokenRepsonse.access_token; //my string token

                                    try
                                    {
                                        string pbiUrl = "https://api.powerbi.com/v1.0/myorg/reports/<company_report_id>";
                                        
                                        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); //Authorization of request 
                                        

                                        var response2 = await client.GetStringAsync(pbiUrl);

                                        var rese = JsonConvert.DeserializeObject<PBIRepost>(response2);
                                        PbiEmbedUrl = rese.embedUrl + "&autoAuth=true" + "&isOwnedByMe=" + rese.isOwnedByMe + "apps/<app_id>";
                                        RaisePropertyChanged(PbiEmbedUrl); 
                                    }
                                    catch (Exception ex)
                                    {

                                        //await App.Current.MainPage.DisplayAlert();
                                    }   
                                }
                                catch (Exception)
                                {
                                    //await App.Current.MainPage.DisplayAlert();
                                }
                            }
                        }
                        else
                        {
                            //await App.Current.MainPage.DisplayAlert();
                        }
                    }
使用(HttpResponseMessage response=wait client.PostAsync(url,内容))
{
if(响应。IsSuccessStatusCode)
{
使用(HttpContent-ContentOfResponse=response.Content)
{
尝试
{
string tokenResponseJSON=await contentOfResponse.ReadAsStringAsync();//json格式的令牌,我需要将其转换为下一行中的字符串
var tokenRepsonse=JsonConvert.DeserializeObject(tokenResponseJSON);
string accessToken=tokenRepsonse.access\u token;//我的字符串令牌
尝试
{
字符串pbiUrl=”https://api.powerbi.com/v1.0/myorg/reports/";
client.DefaultRequestHeaders.Authorization=new System.Net.Http.Headers.authorizationHeaderValue(“Bearer”,accessToken);//请求的授权
var response2=await client.GetStringAsync(pbiUrl);
var rese=JsonConvert.DeserializeObject(response2);
PbiEmbedUrl=rese.embedUrl+“&autoAuth=true”+“&isOwnedByMe=“+rese.isOwnedByMe+”apps/&config=vst1bfluitufjeyjjbhvzdgvy5ldcisimvkrmlzfrlbgvtzwrpcmvjdbc5hbmfsexpcy53aw5kb3dzlm5ldcisimvkrvhdyzxmionsibyzdzvzjvzjvyzjvjjvjvjvjjvjvjjvjvjjjjvjvjjjvjjvjjjjjjvjvjjjjjjjj(不是真正的配置字符串,我不确定是否可以共享真正的配置字符串,所以我弥补了这个问题)


我没有弄乱嵌入url中的配置,所以这可能也是问题所在,但我不知道如何编辑配置。

您不能在web浏览器中简单地导航到嵌入url。这是您要传递给的内容。您必须在浏览器中加载网页,然后让客户端在该浏览器中的
元素中加载报告s页面。请参阅以了解详细信息。@AndreyNikolov嗨,谢谢你的回答。我有点困惑,因为你链接的这个Power BI客户端是用于JavaScript的,而不是Xamarin。我到处搜索类似Xamarin的内容,但没有找到任何内容。我想我在某个地方读到可以在WebView中导入JS文件的内容,所以我会尝试一下。如果你知道关于PBI嵌入Xamarin的纽约文档我将非常感谢您。嵌入Power BI的所有可能方法都可以归结为在浏览器中显示的网页中的iFrame。无论您的应用程序是web应用程序、桌面应用程序还是移动应用程序,都是在浏览器中显示的内容。请再次阅读链接的问题和两个答案。它们是详细说明所有内容(也请阅读给定的链接以嵌入WPF应用程序)。