使用 HttpClient (推荐,现代、高效、灵活)

HttpClient 是 .NET Framework 4.5 和 .NET Core / .NET 5+ 中推荐的用于发送 HTTP 请求和接收响应的类,它性能更好,资源管理更高效,是现代.NET应用的标准做法。

优点:

  • 异步支持:原生支持 async/await,不会阻塞 UI 线程,特别适合桌面应用。
  • 高性能:可以轻松实现连接池,复用 TCP 连接,在高并发场景下表现优异。
  • 灵活性强:可以轻松添加请求头(Headers)、处理 Cookie、上传文件等。
  • 资源管理:实现了 IDisposable 接口,可以方便地使用 Using 语句确保资源被正确释放。

示例代码:

创建一个新的 VB.NET 控制台应用程序项目。 将以下代码粘贴到 Module1.vbForm1.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,这时直接读取可能会出现乱码。HttpClientHttpWebRequest 可以从 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 则留给那些有特殊需求的复杂场景。