wpf - 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 端阻止响应的东西。
解决方案
我能够通过查看 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
推荐阅读
- git - hg clone:没有这样的文件或目录?
- python - 替换数据框中的部分字符串
- visual-studio-code - 定义一个“总是获胜”的 VSCode 方案语法规则
- ios - 集合视图为连续索引路径出列相同单元格
- node.js - 为什么我不能使用 expo init 命令创建 React 本机项目?
- google-cloud-platform - Google Cloud AutoML Vision 支持哪些图像位类型?
- reactjs - 解决此反应 websocket 问题的正确方法?
- r - 在 sparklyr 中使用 ft_one_hot_encoder() 时出错
- jasper-reports - 有人可以帮我处理 Jasper 报告吗
- javascript - Puppeteer 承诺一个事件,这是正确的事件控制流程吗?