適用於簡單 GET/POST、小文件、無需精細控制的場景。
using (var client = new WebClient())
{
// 同步下載位元組
byte[] data = client.DownloadData("https://www.example.com");
string html = Encoding.UTF8.GetString(data);
// 或直接下載字串 (自動處理編碼)
string html2 = client.DownloadString("https://www.example.com");
// 下載到文件
client.DownloadFile("https://example.com/file.zip", @"C:\file.zip");
}
Encoding:設置響應編碼Headers:添加請求頭 (User-Agent, Referer...)Proxy:代理設置DownloadProgressChanged:進度條DownloadFileCompleted:異步完成回調理解 HTTP 原理、需要精細控制 (連接池、管線、自定義協議) 時使用。
string host = "www.example.com";
int port = 80;
// 1. DNS 解析
IPHostEntry hostEntry = Dns.GetHostEntry(host);
IPAddress ip = hostEntry.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ip, port);
// 2. 建立連接
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Connect(endPoint);
// 3. 構建 HTTP GET 請求
string request = $"GET / HTTP/1.1\r\nHost: {host}\r\nConnection: Close\r\n\r\n";
byte[] reqBytes = Encoding.ASCII.GetBytes(request);
socket.Send(reqBytes);
// 4. 接收響應
string response = "";
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = socket.Receive(buffer)) > 0)
{
response += Encoding.ASCII.GetString(buffer, 0, bytesRead);
}
Console.WriteLine(response);
}
| 維度 | WebClient | Socket |
|---|---|---|
| 代碼量 | 極少 | 較多 |
| 協議支援 | HTTP/HTTPS/FTP | 任意 TCP 協議 |
| 自動處理 | 重定向、壓縮、Cookie、編碼 | 完全手工 |
| 控制力度 | 低 | 極高 |
| 效能 (高併發) | 一般 | 可優化連接池、管線 |
| 適用場景 | 簡單下載、API 調用 | 爬蟲、代理、自定義協議、長連接 |
HttpClient (NET 4.5+ / .NET Core 標準):異步優先、可復用、支援 `HttpRequestMessage` 精細控制Flurl.Http、RestSharp:流式 API、自動反序列化HttpWebRequest:舊版底層控制,已不推薦新代碼使用// HttpClient 現代寫法
using (var http = new HttpClient())
{
string html = await http.GetStringAsync("https://api.example.com/data");
var obj = await http.GetFromJsonAsync<MyDto>("https://api.example.com/data");
}
理解 Socket 底層有助於排查網絡疑難雜症,但日常開發請優先使用 HttpClient。