首页 > 解决方案 > WPF Powershell 应用程序在 Invoke-PowerBIRestMethod 上挂起

问题描述

我使用 XAML 创建了一个 Powershell WPF 应用程序,在我的应用程序中,我允许用户在特定工作区中创建一个 Power BI 流数据集,他们事先使用 Connect-PowerBIServiceAccount 对其进行身份验证。用户单击连接到事件的按钮并立即触发 Connect-PowerBIServiceAccount,这会触发 Microsoft OAuth 登录并假设用户已通过身份验证,一切运行正常。但是,紧随其后的步骤涉及使用从我的 WPF 输入中传入的用户填写的参数使用 Invoke-PowerBIRestMethod 发出 Post 请求。此时,我的 WPF 应用程序冻结,似乎没有发生任何事情,但是当我查看 powerbi.com 时,我可以清楚地看到数据集已创建。

在我看来,无论出于何种原因,201 的响应代码都没有返回到我的 WPF 应用程序。我打开了我的 powershell 窗口,发布后可以清楚地看到没有任何响应。这是一个与单击按钮时在 WPF 应用程序内触发发布请求特别相关的同步问题吗?

编辑:我刚刚意识到,当我关闭我的 WPF 应用程序时,我可以在我的 Powershell 控制台中看到响应代码,所以它绝对是 WPF 端阻止响应的东西。

标签: wpfpowershellpowerbi

解决方案


我能够通过查看 SO 上的其他帖子来弄清楚这一点,这些帖子有类似问题的个人使用 C# WPF 应用程序发出 API 请求。我不是 100% 确定为什么响应没有返回到 WPF 应用程序以便它可以继续,但从我读到它与按钮事件处理程序是同步调用有关,并且由于从未收到 201 响应,它只是保持应用程序冻结,直到用户关闭它。通过调用命令作为使调用异步的 powershell 作业,我能够执行与 C# 多线程等效的 powershell。这对我来说仍然很奇怪,因为将数据集发布到 powerbi 的调用本身非常快。如果响应很慢,我可以理解这个问题,但似乎响应从未出现,这让我觉得很奇怪。

代码:

Start-Job -ScriptBlock { param($body)
    Login-PowerBIServiceAccount #even though this is an async call, start-job fires off a thread locally so we can don't need to store credentials and pass them to the following command as that is done automatically.
    Invoke-PowerBIRestMethod -Url 'myEndpoint' -Method Post -Body $body -Verbose #-Headers $PBIToken
    } -ArgumentList $body

推荐阅读