使用HttpClient代替WebClient

前言

有一个项目是从.NetFramework迁移到.Net 9了,在编译的时候,发现有一个警告信息: warning SYSLIB0014: “WebClient.WebClient()”已过时:“WebRequest, HttpWebRequest, ServicePoint, and WebClient are obsolete. Use HttpClient instead.

WebClient这个我在项目中很少使用,上一次使用,感觉至少是10年前,那应该是.Net 4.0之前的项目了,当时的项目比较老,好像当时是写一个ActiveX插件,一次下载多个图片文件.

WebClient是封装WebRequest,使用更简单,在.Net Framework 4.5之后,就建议使用它了,所以在.Net Core及其后面的版本(尤其是会升级版.Net版本的项目),就不要使用WebClient和WebRequest.因为已经标记弃用了,可能会在某一个版本移除.

WebClient请求代码

var entity = new
{
    FirstName = "Jim",
    LastName = "Tom",
    Age = 20
};

var json = JsonSerializer.Serialize(entity);
var buffer = Encoding.UTF8.GetBytes(json);

var url = "http://localhost:5215/api/user/create"; //请求地址

//使用WebClient 做Http Post请求
WebClient webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/json");
var uploadResult = webClient.UploadData(url, buffer);

var result = Encoding.UTF8.GetString(uploadResult);
Console.WriteLine(result);

WebClient已经在.Net 9中标记弃用了,所以使用HttpClient

使用HttpClient代替WebClient

var entity = new
 {
     FirstName = "Jim",
     LastName = "Tom",
     Age = 20
 };

 var json = JsonSerializer.Serialize(entity);

 //如果在客户端使用的,尽量使用静态单例,这里只是为了测试
 //如果是在Asp.Net Core使用IHttpClientFactory注入的方式获取实例
 HttpClient httpClient = new HttpClient();
 httpClient.BaseAddress = new Uri("http://localhost:5215");

 var content = new StringContent(json, Encoding.UTF8, "application/json");
 var httpResponseMessage = await httpClient.PostAsync("/api/user/create", content);
 if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.OK)
 {
     var responseResult = await httpResponseMessage.Content.ReadAsStringAsync();
     Console.WriteLine(responseResult);
 }

测试Server项目

测试的Server项目这里是使用的FastEndPoints,如果是小项目使用还是比较好的,因为FastEndpoints集成了EventBus(事件总线)/JobQueue(任务队列,异步处理某些任务)等组件,也容易上手,使用还比较很方便,性能与Asp.Net Core Minimal相差不大,比Asp.Net Core MVC要好,如果是大项目和多人开发的话,建议使用ABP.
using FastEndpoints;

public class MyEndpoint : Endpoint<MyRequest, MyResponse>
{
    public override void Configure()
    {
        Post("/api/user/create");
        AllowAnonymous();
    }

    public override async Task HandleAsync(MyRequest req, CancellationToken ct)
    {
        await Send.OkAsync(new()
        {
            FullName = $"{req.FirstName} {req.LastName}",
            IsOver18 = req.Age > 18
        }, ct);
    }
}


秋风 2025-10-12