HttpContent.ReadAsAsync<T> 方法是否已在 .NET Core 中被取代?
Has HttpContent.ReadAsAsync<T> method been superceded in .NET Core?
下面指的是一个.NET Core应用,依赖如下...
Microsoft.NETCore.App
Microsoft.AspNet.WepApi.Client (5.2.7)
Microsoft.com 是 2017 年 11 月的文档 Call a Web API From a .NET Client (C#)
。
文档中包含 HTTP GET 的客户端调用。
static HttpClient client = new HttpClient();
static async Task<Product> GetProductAsync(string path)
{
Product product = null;
HttpResponseMessage response = await client.GetAsync(path);
if (response.IsSuccessStatusCode)
{
product = await response.Content.ReadAsAsync<Product>();
}
return product;
}
值 response.Content
引用了一个 HttpContent
对象。至少根据以下文档,截至 2020 年 7 月 HttpContent
没有带有签名 ReadAsAsync<T>()
的实例方法。但是,此实例方法有效。
参考link没有带有签名ReadAsAsync<T>()
的实例方法...
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpcontent?view=netcore-3.1
有一个静态方法 HttpContentExtensions.ReadAsAsync<T>(myContent)
,其中 myContent
引用一个 HttpContent
对象。这个静态方法也可以。
参考link...
https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834253(v=vs.118)
例如,一个记录在案的签名具有...
static icon followed by ReadAsAsync<T>(HttpContent)
和说明它将 return Task<T>
。这个静态方法大概就是实例方法的幕后实现。
但是静态方法网页顶部的信息表明...
“我们不再定期更新此内容。请查看 Microsoft 产品生命周期以了解有关如何支持此产品、服务、技术或 API 的信息。”
实例和静态两种形式的 HttpContent.ReadAsAsync<T>()
是否已在 .NET Core 3.1 中被取代?
我无法从代码中判断它是否曾经是实例方法,但它可能是。
您添加的链接在.net 4.x和.net core之间交替出现,不清楚您是否知道这个的。用日期标记它们表明线性进展,但我们有一个岔路口。
仅此而已,'demoted' 驻留在一个额外的包中,因为它会被更少地使用。在 .net 核心中,我们现在有类似的扩展方法直接作用于 HttpClient。
为了将其与 .net 核心一起使用 3.x 您可能需要添加 System.Net.Http.Json
nuget 包。扩展仅适用于 System.Text.Json
,对于 Newtonsoft,您将不得不使用传统的代码模式。
最近用的东西,要装Newtonsoft.Json
string responseContent = await response.Content.ReadAsStringAsync();
var productResult = JsonConverter.DeserializeObject<Product>(responseContent);
我实际上在有关如何使用 REST API 的 Microsoft 文档中找到了它,并且它起作用了。你的代码在 get 部分没问题,假设它有正确的 Uri,
还有一点需要注意的是我的代码不是静态的
其他答案不正确。
方法 ReadAsAsync 是 System.Net.Http.Formatting.dll
的一部分
这又是 nuget 的一部分:Microsoft.AspNet.WebApi.Client
我刚刚创建了一个新的控制台项目 .Net Core 3.1 并添加了 2 个 nugets
- 牛顿软件
- Microsoft.AspNet.WebApi.Client
我用 .NET Core 3.1 创建了一个项目,下面是一些图片:
这是我的项目文件:
这是我刚刚编写的代码,编译得很好:
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace Custom.ApiClient
{
internal static class WebApiManager
{
//private const string _requestHeaderBearer = "Bearer";
private const string _responseFormat = "application/json";
private static readonly HttpClient _client;
static WebApiManager()
{
// Setup the client.
_client = new HttpClient { BaseAddress = new Uri("api url goes here"), Timeout = new TimeSpan(0, 0, 0, 0, -1) };
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_responseFormat));
// Add the API Bearer token identifier for this application.
//_client.DefaultRequestHeaders.Add(RequestHeaderBearer, ConfigHelper.ApiBearerToken);
}
public static async Task<T> Get<T>()
{
var response = _client.GetAsync("api extra path and query params go here");
return await ProcessResponse<T>(response);
}
private static async Task<T> ProcessResponse<T>(Task<HttpResponseMessage> responseTask)
{
var httpResponse = await responseTask;
if(!httpResponse.IsSuccessStatusCode)
throw new HttpRequestException(httpResponse.ToString());
var dataResult = await httpResponse.Content.ReadAsAsync<T>();
return dataResult;
}
}
}
更新:
清除关于包 Microsoft.AspNet.WebApi.Client
依赖项的一些混淆
这是一张依赖关系的图片,显示截至 2020-10-27 的依赖关系,清楚地表明它依赖于 Newtonsoft JSON 10 或更高版本。到今天为止,没有使用 System.Text.Json 替代 ReadAsAsync...所以您可以使用 ApiClient + Newtonsoft Json 或使用 System.Text.Json
创建您自己的
如果你不想安装第三方nuget包,为此实现一个扩展方法并不太难。
例如,使用System.Text.Json
:
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public static class HttpContentExtensions {
private static readonly JsonSerializerOptions defaultOptions = new JsonSerializerOptions {
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
public static async Task<T> ReadAsAsync<T>(this HttpContent content, JsonSerializerOptions options = null) {
using(Stream contentStream = await content.ReadAsStreamAsync()) {
return await JsonSerializer.DeserializeAsync<T>(contentStream, options ?? defaultOptions);
}
}
}
下面指的是一个.NET Core应用,依赖如下...
Microsoft.NETCore.App
Microsoft.AspNet.WepApi.Client (5.2.7)
Microsoft.com 是 2017 年 11 月的文档 Call a Web API From a .NET Client (C#)
。
文档中包含 HTTP GET 的客户端调用。
static HttpClient client = new HttpClient();
static async Task<Product> GetProductAsync(string path)
{
Product product = null;
HttpResponseMessage response = await client.GetAsync(path);
if (response.IsSuccessStatusCode)
{
product = await response.Content.ReadAsAsync<Product>();
}
return product;
}
值 response.Content
引用了一个 HttpContent
对象。至少根据以下文档,截至 2020 年 7 月 HttpContent
没有带有签名 ReadAsAsync<T>()
的实例方法。但是,此实例方法有效。
参考link没有带有签名ReadAsAsync<T>()
的实例方法...
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpcontent?view=netcore-3.1
有一个静态方法 HttpContentExtensions.ReadAsAsync<T>(myContent)
,其中 myContent
引用一个 HttpContent
对象。这个静态方法也可以。
参考link... https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834253(v=vs.118)
例如,一个记录在案的签名具有...
static icon followed by
ReadAsAsync<T>(HttpContent)
和说明它将 return Task<T>
。这个静态方法大概就是实例方法的幕后实现。
但是静态方法网页顶部的信息表明... “我们不再定期更新此内容。请查看 Microsoft 产品生命周期以了解有关如何支持此产品、服务、技术或 API 的信息。”
实例和静态两种形式的 HttpContent.ReadAsAsync<T>()
是否已在 .NET Core 3.1 中被取代?
我无法从代码中判断它是否曾经是实例方法,但它可能是。
您添加的链接在.net 4.x和.net core之间交替出现,不清楚您是否知道这个的。用日期标记它们表明线性进展,但我们有一个岔路口。
仅此而已,'demoted' 驻留在一个额外的包中,因为它会被更少地使用。在 .net 核心中,我们现在有类似的扩展方法直接作用于 HttpClient。
为了将其与 .net 核心一起使用 3.x 您可能需要添加 System.Net.Http.Json
nuget 包。扩展仅适用于 System.Text.Json
,对于 Newtonsoft,您将不得不使用传统的代码模式。
最近用的东西,要装Newtonsoft.Json
string responseContent = await response.Content.ReadAsStringAsync();
var productResult = JsonConverter.DeserializeObject<Product>(responseContent);
我实际上在有关如何使用 REST API 的 Microsoft 文档中找到了它,并且它起作用了。你的代码在 get 部分没问题,假设它有正确的 Uri,
还有一点需要注意的是我的代码不是静态的
其他答案不正确。
方法 ReadAsAsync 是 System.Net.Http.Formatting.dll
的一部分这又是 nuget 的一部分:Microsoft.AspNet.WebApi.Client
我刚刚创建了一个新的控制台项目 .Net Core 3.1 并添加了 2 个 nugets
- 牛顿软件
- Microsoft.AspNet.WebApi.Client
我用 .NET Core 3.1 创建了一个项目,下面是一些图片:
这是我的项目文件:
这是我刚刚编写的代码,编译得很好:
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace Custom.ApiClient
{
internal static class WebApiManager
{
//private const string _requestHeaderBearer = "Bearer";
private const string _responseFormat = "application/json";
private static readonly HttpClient _client;
static WebApiManager()
{
// Setup the client.
_client = new HttpClient { BaseAddress = new Uri("api url goes here"), Timeout = new TimeSpan(0, 0, 0, 0, -1) };
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_responseFormat));
// Add the API Bearer token identifier for this application.
//_client.DefaultRequestHeaders.Add(RequestHeaderBearer, ConfigHelper.ApiBearerToken);
}
public static async Task<T> Get<T>()
{
var response = _client.GetAsync("api extra path and query params go here");
return await ProcessResponse<T>(response);
}
private static async Task<T> ProcessResponse<T>(Task<HttpResponseMessage> responseTask)
{
var httpResponse = await responseTask;
if(!httpResponse.IsSuccessStatusCode)
throw new HttpRequestException(httpResponse.ToString());
var dataResult = await httpResponse.Content.ReadAsAsync<T>();
return dataResult;
}
}
}
更新:
清除关于包 Microsoft.AspNet.WebApi.Client
依赖项的一些混淆这是一张依赖关系的图片,显示截至 2020-10-27 的依赖关系,清楚地表明它依赖于 Newtonsoft JSON 10 或更高版本。到今天为止,没有使用 System.Text.Json 替代 ReadAsAsync...所以您可以使用 ApiClient + Newtonsoft Json 或使用 System.Text.Json
创建您自己的如果你不想安装第三方nuget包,为此实现一个扩展方法并不太难。
例如,使用System.Text.Json
:
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public static class HttpContentExtensions {
private static readonly JsonSerializerOptions defaultOptions = new JsonSerializerOptions {
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
public static async Task<T> ReadAsAsync<T>(this HttpContent content, JsonSerializerOptions options = null) {
using(Stream contentStream = await content.ReadAsStreamAsync()) {
return await JsonSerializer.DeserializeAsync<T>(contentStream, options ?? defaultOptions);
}
}
}