You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中如何将已过时的WebClient转换为HttpClient

将过时的WebClient上传文件代码转换为HttpClient实现

以下是和原WebClient代码功能完全一致的HttpClient实现:

using System.Net.Http;
using System.Net.Http.Headers;
using System.IO;
using System.Text;

// 注意:HttpClient推荐全局复用,避免频繁创建实例导致资源浪费
using var httpClient = new HttpClient();
// 设置User-Agent请求头,和原代码逻辑一致
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd($"{CompanyName}/{ProductName}");

// 构建multipart/form-data表单,匹配WebClient.UploadFile的默认上传格式
using var formContent = new MultipartFormDataContent();
// 读取目标文件并添加到表单,表单字段名默认为"file",文件名使用文件原始名称
using var fileStream = File.OpenRead(fileimage);
formContent.Add(new StreamContent(fileStream), "file", Path.GetFileName(fileimage));

// 发送POST请求并获取响应(如需同步执行,可在末尾加.GetAwaiter().GetResult())
using var response = await httpClient.PostAsync("http://blahblah.com/upload.php", formContent);
// 模拟原WebClient的失败抛出逻辑,HTTP状态码非2xx时抛出异常
response.EnsureSuccessStatusCode();

// 读取响应字节并转换为默认编码的字符串
byte[] responseBytes = await response.Content.ReadAsByteArrayAsync();
string responseContent = Encoding.Default.GetString(responseBytes);

// 弹出消息框显示响应内容
_ = MessageBox.Show(responseContent, Text);

关键说明:

  • HttpClient复用:原WebClient是单次实例化使用,但HttpClient建议全局复用(比如在WinForms应用中声明静态字段),避免频繁创建实例导致Socket资源耗尽。
  • 同步/异步选择:上面代码用了异步方法(await),这是HttpClient推荐的使用方式;如果需要和原WebClient一样同步执行,可将await httpClient.PostAsync(...)改为httpClient.PostAsync(...).GetAwaiter().GetResult(),但异步更适合UI线程避免卡顿。
  • 表单字段匹配:WebClient.UploadFile默认将文件作为multipart/form-data表单的file字段上传,确保服务端接收的字段名一致,如果服务端用了其他字段名,修改formContent.Add的第二个参数即可。
  • 异常处理:response.EnsureSuccessStatusCode()会在HTTP状态码非2xx时抛出HttpRequestException,和原WebClient请求失败时抛出WebException的行为一致。

内容的提问来源于stack exchange,提问作者Nilez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:25:27