繁体   English   中英

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

[英]How to replace obsolete WebClient with HttpClient in .NET 6

Since WebClient is deprecated in .NET 6, I want to convert the following code using WebClient with an equivalent code using HttpClient for calling a 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);

特别是我对HttpClient的Encoding和Headers的设置有些疑惑。 任何人都可以使用 HttpClient 提供等效代码,它可以替换 .NET 6 中的上述代码吗? 提前致谢。

看起来很简单:

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();

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

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

按照 Richard Deeming 的建议,我实施了以下解决方案:

var httpClient = _httpClientFactory.CreateClient();
httpClient.DefaultRequestHeaders.Add("user_key", tokens[0]);
httpClient.DefaultRequestHeaders.Add("Session_key", tokens[1]);
using var response = await HttpClientJsonExtensions.PostAsJsonAsync(httpClient, _baseUrl + "sms", sms);
response.EnsureSuccessStatusCode();

这似乎是替换原始代码最简洁有效的方法。

.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();

这是一个帖子:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM