c# - 有 HttpContent.ReadAsAsync方法已在 .NET Core 中被取代?
问题描述
下面指的是一个 .NET Core 应用程序,其依赖关系如下...
Microsoft.NETCore.App
Microsoft.AspNet.WepApi.Client (5.2.7)
Microsoft.com 上是Call a Web API From a .NET Client (C#)
2017 年 11 月的文档。
在文档中是 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>()
,至少根据以下文档。但是,此实例方法有效。
没有带有签名的实例方法的参考链接ReadAsAsync<T>()
...
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpcontent?view=netcore-3.1
有一个静态方法HttpContentExtensions.ReadAsAsync<T>(myContent)
引用myContent
一个HttpContent
对象。这种静态方法也有效。
参考链接... https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834253(v=vs.118)
例如,一个记录在案的签名具有...
静态图标后跟
ReadAsAsync<T>(HttpContent)
以及说明它将返回的描述Task<T>
。这个静态方法可能是实例方法的幕后实现。
但是,静态方法网页顶部的信息表明...“我们不再定期更新此内容。请查看 Microsoft 产品生命周期以了解有关如何支持此产品、服务、技术或 API 的信息。 ”
.NET Core 3.1 是否已经HttpContent.ReadAsAsync<T>()
取代了实例和静态两种形式?
解决方案
其他答案不正确。
ReadAsAsync 方法是 System.Net.Http.Formatting.dll 的一部分
这又是 nuget 的一部分:Microsoft.AspNet.WebApi.Client
我刚刚创建了一个新的控制台项目 .Net Core 3.1 并添加了 2 个 nuget
- 牛顿软件
- 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 创建自己的
推荐阅读
- android - TextView 超出了 ConstraintLayout
- php - 如何正确处理日期和时间?
- go - golang rabbitmq channel.consume SIGSEGV
- r - 无法安装 R 包“data.table”。- 麦克空气
- swift - 如何从 Button ,Swift 中删除图像?
- c - 为什么我的文件在 C 中分叉时即使在有保护的情况下也会执行此标头两次?
- html - 网站无法识别通过 VBA 代码完成的选择
- javascript - 如何在不转换为数组的情况下按另一个对象内的对象的值排序?
- android - 可绘制渐变在预览中看起来不错,但在实际应用中被破坏了
- javascript - 如何使纹理始终面向相机..?