使用 HttpClient (推荐,现代、高效、灵活)
HttpClient 是 .NET Framework 4.5 和 .NET Core / .NET 5+ 中推荐的用于发送 HTTP 请求和接收响应的类,它性能更好,资源管理更高效,是现代.NET应用的标准做法。
优点:
- 异步支持:原生支持
async/await,不会阻塞 UI 线程,特别适合桌面应用。 - 高性能:可以轻松实现连接池,复用 TCP 连接,在高并发场景下表现优异。
- 灵活性强:可以轻松添加请求头(Headers)、处理 Cookie、上传文件等。
- 资源管理:实现了
IDisposable接口,可以方便地使用Using语句确保资源被正确释放。
示例代码:
创建一个新的 VB.NET 控制台应用程序项目。
将以下代码粘贴到 Module1.vb 或 Form1.vb 中。
' 需要导入的命名空间
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.IO
Public Class Form1
' 创建一个静态的 HttpClient 实例,这样可以复用,提高性能。
' 注意:在应用程序的生命周期内,通常只需要创建一个 HttpClient 实例。
Private Shared ReadOnly httpClient As New HttpClient()
' 窗体加载事件
Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
' 目标网址
Dim url As String = "https://www.baidu.com"
' 调用异步方法获取网页源码
Dim htmlSource As String = Await GetWebPageSourceAsync(url)
' 将获取到的源码显示在 TextBox 控件中
' 假设你窗体上有一个名为 TextBox1 的 TextBox 控件
TextBox1.Text = htmlSource
' 如果是在控制台应用程序,则使用 Console.WriteLine
' Console.WriteLine(htmlSource)
Catch ex As Exception
' 捕获并显示异常信息
MessageBox.Show($"发生错误: {ex.Message}")
' Console.WriteLine($"发生错误: {ex.Message}")
End Try
End Sub
''' <summary>
''' 异步获取网页源码的方法
''' </summary>
''' <param name="url">目标网址</param>
''' <returns>网页的 HTML 源码字符串</returns>
Public Async Function GetWebPageSourceAsync(url As String) As Task(Of String)
' Using 语句可以确保在代码块执行完毕后,自动释放 HttpResponseMessage 对象
Using response As HttpResponseMessage = Await httpClient.GetAsync(url)
' 确保响应状态码是成功的 (200 OK)
response.EnsureSuccessStatusCode()
' 读取响应内容为流
Using stream As Stream = Await response.Content.ReadAsStreamAsync()
' 使用 StreamReader 将流读取为字符串
Using reader As New StreamReader(stream)
Return Await reader.ReadToEndAsync()
End Using
End Using
End Using
End Function
End Class
使用 WebClient (简单易用,但已过时)
WebClient 是 .NET Framework 中一个非常简单的类,用于从 URI 下载数据,它非常易于使用,但功能相对有限,并且在 .NET Core 中已被标记为过时,对于简单的任务,它仍然是一个不错的选择。
优点:
- 代码简单:API 非常直观,几行代码就能完成。
- 同步和异步方法:同时提供同步(如
DownloadString)和异步(如DownloadStringAsync)方法。
缺点:
- 性能较差:每次请求都会创建一个新的连接,没有连接池。
- 已过时:微软官方文档已标记为过时,建议在新项目中使用
HttpClient。
示例代码:
Imports System.Net
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Dim url As String = "https://www.wikipedia.org"
Dim wc As New WebClient()
' WebClient 的编码默认是 UTF-8,但有时可能需要手动指定
' wc.Encoding = Encoding.UTF8
' 同步方法会阻塞 UI 线程,在桌面应用中要小心使用
Dim htmlSource As String = wc.DownloadString(url)
' 将结果赋值给 TextBox
TextBox1.Text = htmlSource
Catch ex As WebException
' WebException 是处理网络相关错误的专用异常
MessageBox.Show($"网络错误: {ex.Message}")
Catch ex As Exception
MessageBox.Show($"发生错误: {ex.Message}")
End Try
End Sub
End Class
使用 HttpWebRequest (功能强大,但代码繁琐)
HttpWebRequest 提供了对 HTTP 协议的底层访问,功能非常强大,可以精确控制请求的每一个细节(如请求头、Cookie、协议版本等),它的 API 相对复杂,代码量比前两种方法要多。
优点:
- 功能最全面:可以处理各种复杂的 HTTP 请求场景。
- 控制力强:可以设置几乎所有的 HTTP 选项。
缺点:
- 代码复杂:需要手动创建请求、获取响应、读取流,代码冗长。
- 易于出错:需要手动处理很多细节,比如流和连接的关闭。
示例代码:
Imports System.Net
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Dim url As String = "https://httpbin.org/get"
Dim request As HttpWebRequest = WebRequest.Create(url)
request.Method = "GET" ' 或 "POST", "PUT" 等
' 获取响应
Using response As HttpWebResponse = request.GetResponse()
' 检查响应状态
If response.StatusCode = HttpStatusCode.OK Then
' 读取响应流
Using stream As Stream = response.GetResponseStream()
Using reader As New StreamReader(stream)
Dim htmlSource As String = reader.ReadToEnd()
' 将结果赋值给 TextBox
TextBox1.Text = htmlSource
End Using
End Using
Else
MessageBox.Show($"请求失败,状态码: {response.StatusCode}")
End If
End Using
Catch ex As WebException
MessageBox.Show($"网络错误: {ex.Message}")
Catch ex As Exception
MessageBox.Show($"发生错误: {ex.Message}")
End Try
End Sub
End Class
总结与对比
| 特性 | HttpClient (推荐) |
WebClient (简单) |
HttpWebRequest (强大) |
|---|---|---|---|
| 易用性 | 中等 | 高 | 低 |
| 性能 | 高 | 低 | 中等 |
| 灵活性 | 高 | 中等 | 非常高 |
| 异步支持 | 原生、优秀 | 有 | 有,但实现复杂 |
| 现代性 | 现代标准 | 已过时 | 传统 |
| 适用场景 | 所有新项目,尤其是需要高性能和异步的项目。 | 快速原型开发、简单的脚本任务。 | 需要精细控制 HTTP 请求的复杂场景。 |
额外提示:处理编码问题
有时,网页源码的编码不是 UTF-8,这时直接读取可能会出现乱码。HttpClient 和 HttpWebRequest 可以从 HTTP 响应头中自动检测编码。
WebClient 也可以通过设置 WebClient.Encoding 来解决。
使用 HttpClient 自动处理编码的更健壮写法:
Public Async Function GetWebPageSourceAsync(url As String) As Task(Of String)
Using response As HttpResponseMessage = Await httpClient.GetAsync(url)
response.EnsureSuccessStatusCode()
' 直接使用 ReadAsStringAsync 方法,它会自动处理编码
Return Await response.Content.ReadAsStringAsync()
End Using
End Function
response.Content.ReadAsStringAsync() 是最简单且推荐的方式,因为它会自动处理从响应头(Content-Type)中获取的字符编码。
对于新的 VB.NET 项目,强烈建议您使用 HttpClient,它代表了现代.NET开发的最佳实践,既强大又高效,如果您只是想快速写几行代码完成一个简单任务,WebClient 也可以用,但要记得它已过时。HttpWebRequest 则留给那些有特殊需求的复杂场景。
