核心概念
无论使用哪种方法,其基本流程都是相似的:

(图片来源网络,侵删)
- 创建请求:告诉服务器你想获取哪个网页。
- 发送请求:向服务器发送请求。
- 获取响应:接收服务器返回的数据。
- 读取响应内容:将返回的数据(即网页源码)读取出来。
使用 HttpClient (推荐,现代标准)
这是目前 .NET (包括 VB.NET) 官方推荐的方式,它功能强大、性能优越,并且是异步编程的首选,对于新项目,强烈建议使用此方法。
优点:
- 性能高:支持异步操作 (
Async/Await),不会阻塞应用程序主线程,适合桌面应用和Web应用。 - 功能丰富:提供了丰富的API来处理HTTP请求、响应、Cookie等。
- 灵活:可以轻松配置请求头、超时时间、代理等。
示例代码 (同步版本 - 简单直接)
' 需要导入以下命名空间
Imports System.Net.Http
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private Async Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
' 禁用按钮,防止重复点击
ButtonGetSource.Enabled = False
TextBoxSource.Text = "正在获取,请稍候..."
Try
' 1. 创建 HttpClient 实例
Using client As New HttpClient()
' 设置一个合理的超时时间(例如10秒)
client.Timeout = TimeSpan.FromSeconds(10)
' 2. 创建请求的 URL
Dim url As String = "https://www.example.com"
' 3. 发送 GET 请求并获取响应
' GetStringAsync 是一个便捷方法,它会自动将响应内容读取为字符串
Dim sourceCode As String = Await client.GetStringAsync(url)
' 4. 在文本框中显示源码
TextBoxSource.Text = sourceCode
End Using
Catch ex As Exception
' 捕获并显示可能发生的错误,例如网络连接失败、超时等
TextBoxSource.Text = $"发生错误: {ex.Message}"
Finally
' 无论成功或失败,都重新启用按钮
ButtonGetSource.Enabled = True
End Try
End Sub
End Class
示例代码 (异步版本 - 更专业,推荐用于UI应用)
上面的 Async Sub 例子已经包含了异步的核心,下面是一个更完整的 Async Function 版本,通常用于类库或非UI场景。
Imports System.Net.Http
Imports System.Threading.Tasks
Public Class WebFetcher
Public Shared Async Function GetWebPageSourceAsync(url As String) As Task(Of String)
Using client As New HttpClient()
' 可以设置 User-Agent,模拟浏览器访问,防止被某些网站屏蔽
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
client.Timeout = TimeSpan.FromSeconds(15)
' 发送请求并获取响应流
Using response As HttpResponseMessage = Await client.GetAsync(url)
' 确保响应状态码是成功的 (200 OK)
response.EnsureSuccessStatusCode()
' 将响应内容作为字符串读取
Return Await response.Content.ReadAsStringAsync()
End Using
End Using
End Function
End Class
' 在窗体中调用
Private Async Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
ButtonGetSource.Enabled = False
TextBoxSource.Text = "正在获取..."
Try
Dim source As String = Await WebFetcher.GetWebPageSourceAsync("https://www.example.com")
TextBoxSource.Text = source
Catch ex As HttpRequestException
TextBoxSource.Text = $"HTTP请求错误: {ex.Message}"
Catch ex As TaskCanceledException
TextBoxSource.Text = "请求超时或被取消。"
Catch ex As Exception
TextBoxSource.Text = $"发生未知错误: {ex.Message}"
Finally
ButtonGetSource.Enabled = True
End Try
End Sub
使用 WebClient (简单易用,但已过时)
WebClient 是 .NET Framework 中一个非常简单的类,用于发送和接收数据,它的语法非常简洁,适合快速实现简单的下载功能。
优点:
- 语法简单:代码量少,易于上手。
- 同步/异步支持:提供了
DownloadString(同步) 和DownloadStringAsync(异步) 方法。
缺点:
- 已过时:微软官方文档已将其标记为“已过时”(obsolete),并推荐使用
HttpClient。 - 功能有限:不如
HttpClient灵活,配置选项较少。 - 性能问题:在大量并发请求时,性能不如
HttpClient。
示例代码
Imports System.Net
Public Class Form1
Private Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
ButtonGetSource.Enabled = False
TextBoxSource.Text = "正在获取..."
Try
' 1. 创建 WebClient 实例
Using client As New WebClient()
' 可以设置编码,防止中文乱码
client.Encoding = System.Text.Encoding.UTF8
' 2. 下载网页源码
' DownloadString 是同步方法,会阻塞当前线程
Dim sourceCode As String = client.DownloadString("https://www.example.com")
' 3. 显示结果
TextBoxSource.Text = sourceCode
End Using
Catch ex As Exception
TextBoxSource.Text = $"发生错误: {ex.Message}"
Finally
ButtonGetSource.Enabled = True
End Try
End Sub
End Class
使用 HttpWebRequest / HttpWebResponse (底层灵活,但繁琐)
这是最底层、最传统的方式,它提供了对HTTP协议的完全控制,你可以手动设置请求头、内容、方法(GET, POST等)。

(图片来源网络,侵删)
优点:
- 控制力最强:可以精确控制HTTP请求的每一个细节。
- 兼容性最好:在非常古老的 .NET Framework 版本中也能使用。
缺点:
- 代码繁琐:需要手动管理请求流、响应流,代码量多,容易出错。
- 使用复杂:相比前两种方法,使用起来更麻烦。
示例代码
Imports System.IO
Imports System.Net
Public Class Form1
Private Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
ButtonGetSource.Enabled = False
TextBoxSource.Text = "正在获取..."
Try
' 1. 创建 HttpWebRequest 对象
Dim request As HttpWebRequest = WebRequest.Create("https://www.example.com")
request.Method = "GET"
request.Timeout = 10000 ' 10秒超时
' 2. 获取响应
Using response As HttpWebResponse = request.GetResponse()
' 检查响应状态码
If response.StatusCode = HttpStatusCode.OK Then
' 3. 获取响应流
Using stream As Stream = response.GetResponseStream()
' 4. 使用 StreamReader 读取流内容
Using reader As New StreamReader(stream)
' 5. 读取到字符串
Dim sourceCode As String = reader.ReadToEnd()
TextBoxSource.Text = sourceCode
End Using
End Using
Else
TextBoxSource.Text = $"服务器返回错误: {response.StatusCode}"
End If
End Using
Catch ex As WebException
TextBoxSource.Text = $"网络请求错误: {ex.Message}"
Catch ex As Exception
TextBoxSource.Text = $"发生错误: {ex.Message}"
Finally
ButtonGetSource.Enabled = True
End Try
End Sub
End Class
总结与选择建议
| 特性 | HttpClient (推荐) |
WebClient (简单) |
HttpWebRequest (底层) |
|---|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ |
| 易用性 | 简单 | 非常简单 | 复杂 |
| 性能 | 高 (支持异步) | 一般 | 一般 |
| 灵活性 | 高 | 低 | 非常高 |
| 状态 | 现代标准 | 已过时 | 传统方法 |
| 适用场景 | 所有新项目,特别是需要高性能和异步的场景。 | 快速原型、简单的脚本任务。 | 需要精细控制HTTP协议的复杂场景。 |
对于绝大多数情况,请直接选择 HttpClient,它既现代又高效,是 .NET 生态系统的未来,除非你有特殊理由(例如维护旧代码),否则不应该再使用 WebClient 或 HttpWebRequest 来开发新功能。

(图片来源网络,侵删)
