VB.NET中HTTP GET请求报错,寻求可行修复方案
报错原因
HttpClient.GetAsync是异步方法,返回值为Task(Of HttpResponseMessage)类型,你没有等待异步任务执行完成就直接调用ToString,输出的是Task类型的元信息,就是你看到的报错内容,而非实际的HTTP响应结果。- 你当前代码的请求头配置和可正常运行的VBA代码不一致:VBA用的请求头Key为
Subscription-Key-Id,.NET代码里写的是Ocp-Apim-Subscription-Key,且缺少Host请求头,即使拿到响应也大概率会返回请求失败。 - 你之前的VBA代码用的是同步阻塞请求逻辑,VB.NET代码直接调用异步方法没有做同步等待或者异步处理,逻辑不匹配。
修复方案
分两种实现方式,可根据你的项目场景选择:
方案1:同步实现(和原有VBA逻辑一致)
直接等待异步任务完成拿到响应结果,适合不想改动现有同步代码逻辑的场景:
' 建议HttpClient声明为静态全局变量,避免每次请求重复实例化造成套接字资源耗尽 Private Shared ReadOnly client As New HttpClient() Sub 你的调用方法() Try ' 配置请求头,和VBA逻辑对齐 client.DefaultRequestHeaders.Clear() client.DefaultRequestHeaders.Add("Subscription-Key-Id", "{Subscription-Key}") client.DefaultRequestHeaders.Add("Host", "site Address") ' 替换为实际的站点域名 Dim uri = "https://example.com/" & SearchKey ' 等待请求完成拿到响应 Dim response = client.GetAsync(uri).ConfigureAwait(False).GetAwaiter().GetResult() ' 校验请求是否成功 response.EnsureSuccessStatusCode() ' 读取响应文本 Dim jsonText = response.Content.ReadAsStringAsync().ConfigureAwait(False).GetAwaiter().GetResult() ' ========== 读取响应头并填充ListView ========== lstMer.Items.Clear() ' 先添加响应头信息 For Each header In response.Headers Dim item As New ListViewItem(header.Key) item.SubItems.Add(String.Join(";", header.Value)) lstMer.Items.Add(item) Next ' 添加响应内容 Dim jsonItem As New ListViewItem("响应内容") jsonItem.SubItems.Add(jsonText) lstMer.Items.Add(jsonItem) Catch ex As Exception ' 异常处理,比如请求失败的情况 lstMer.Items.Clear() lstMer.Items.Add(New ListViewItem({"请求错误", ex.Message})) End Try End Sub
方案2:异步实现(.NET推荐最佳实践,不会阻塞UI线程)
如果是WinForm/WPF等UI项目,推荐用异步方式避免界面卡顿:
Private Shared ReadOnly client As New HttpClient() ' 注意方法要加Async修饰符,如果是按钮点击事件就是Async Sub Async Sub 你的异步调用方法() Try client.DefaultRequestHeaders.Clear() client.DefaultRequestHeaders.Add("Subscription-Key-Id", "{Subscription-Key}") client.DefaultRequestHeaders.Add("Host", "site Address") Dim uri = "https://example.com/" & SearchKey ' 用Await等待异步请求完成 Dim response = Await client.GetAsync(uri) response.EnsureSuccessStatusCode() Dim jsonText = Await response.Content.ReadAsStringAsync() ' 填充ListView的逻辑和同步方案一致 lstMer.Items.Clear() For Each header In response.Headers Dim item As New ListViewItem(header.Key) item.SubItems.Add(String.Join(";", header.Value)) lstMer.Items.Add(item) Next Dim jsonItem As New ListViewItem("响应内容") jsonItem.SubItems.Add(jsonText) lstMer.Items.Add(jsonItem) Catch ex As Exception lstMer.Items.Clear() lstMer.Items.Add(New ListViewItem({"请求错误", ex.Message})) End Try End Sub
额外注意事项
- 如果需要解析JSON内容拆分后填充ListView,可以引入
Newtonsoft.JsonNuGet包,将返回的jsonText反序列化为实体类后逐行添加。 - HttpClient全局静态实例化可以避免频繁创建销毁实例导致的系统套接字资源占用过高问题。
内容的提问来源于stack exchange,提问作者Joseph Kachappilly
相关产品推荐
相关产品推荐

