如何在 .NET 6 中用 HttpClient 替换过时的 WebClient

Fab*_*ius 13 c# api dotnet-httpclient .net-6.0

由于 WebClient 在 .NET 6 中已弃用,因此我想使用 WebClient 将以下代码转换为使用 HttpClient 调用 REST Web API 的等效代码:

using WebClient client = new();
client.Encoding = Encoding.UTF8;
client.Headers.Set(HttpRequestHeader.ContentType, "application/json");
client.Headers.Add("user_key", tokens[0]);
client.Headers.Add("Session_key", tokens[1]);
string json = JsonSerializer.Serialize(sms);
string serverResponse = client.UploadString(_baseUrl + "sms", "POST", json);
Run Code Online (Sandbox Code Playgroud)

目前,我实施了以下解决方案:

HttpClient httpClient = _httpClientFactory.CreateClient();
HttpRequestMessage request = new(HttpMethod.Post, _baseUrl + "sms");
request.Headers.Add("user_key", tokens[0]);
request.Headers.Add("Session_key", tokens[1]);
string json = JsonSerializer.Serialize(sms);
request.Content = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json);
using HttpResponseMessage response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
Run Code Online (Sandbox Code Playgroud)

我认为上述解决方案是替换原始代码的最干净、最有效的方法。有专家可以证实一下吗?

Chr*_*ton 18

.Net 6支持同步Send()

这是一个简单的 GET:

using var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.example.com/api/v1/get");
var response = httpClient.Send(request);
using var reader = new StreamReader(response.Content.ReadAsStream());
var responseBody = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

这是一个帖子:

var handler = new HttpClientHandler {
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};

var client = new HttpClient(handler) {
    BaseAddress = new Uri(_baseurl) 
};

var webRequest = new HttpRequestMessage(HttpMethod.Post, "sms") {
    Content = new StringContent(json, Encoding.UTF8, "application/json")
};

webRequest.Headers.Add("user_key", tokens[0]);
webRequest.Headers.Add("Session_key", tokens[1]);

var response = client.Send(webRequest);
var reader = new StreamReader(response.Content.ReadAsStream());
var responseBody = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

  • 它并不是“更好”,但它是人们可能想知道其存在的新功能。 (2认同)

Ric*_*ing 3

看起来很简单:

HttpClient client = new()
{
    BaseAddress = new Uri(_baseUrl)
};

using HttpRequestMessage request = new(HttpMethod.Post, "sms");
request.Headers.Add("user_key", tokens[0]);
request.Headers.Add("Session_key", tokens[1]);

string json = JsonSerializer.Serialize(sms);
request.Content = new StringContent(json, Encoding.UTF8)
{
    Headers =
    {
        ContentType = new("application/json")
    }
};

using HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
string serverResponse = await response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望使用IHttpClientFactory来创建HttpClient实例,因为这提供了多个好处 - 特别是池化底层消息处理程序,以避免性能问题。

您可能还想考虑使用扩展PostAsJsonAsync方法,它可以简化此代码。