[英]'System.Net.WebClient.AllowReadStreamBuffering' is obsolete'
[英]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.