C# 具有HttpContent.ReadAsAsync<;T>;方法是否已在.NET Core中被取代?
以下引用了一个.NET核心应用程序,其依赖项如下所示C# 具有HttpContent.ReadAsAsync<;T>;方法是否已在.NET Core中被取代?,c#,asp.net-core,httpresponse,C#,Asp.net Core,Httpresponse,以下引用了一个.NET核心应用程序,其依赖项如下所示 Microsoft.NETCore.App Microsoft.AspNet.WepApi.Client (5.2.7) Microsoft.com上的文档是2017年11月起从.NET客户端(C#)调用Web API的 链接 在文档中是HTTP GET的客户端调用 static HttpClient client = new HttpClient(); static async Task<Product> Ge
Microsoft.NETCore.App
Microsoft.AspNet.WepApi.Client (5.2.7)
Microsoft.com上的文档是2017年11月起从.NET客户端(C#)调用Web API的
链接
在文档中是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;
}
statichttpclient=newhttpclient();
静态异步任务GetProductAsync(字符串路径)
{
Product=null;
HttpResponseMessage response=wait client.GetAsync(路径);
if(响应。IsSuccessStatusCode)
{
product=wait response.Content.ReadAsAsync();
}
退货产品;
}
值response.Content
指的是HttpContent
对象。至少根据以下文档,截至2020年7月,HttpContent
没有签名为ReadAsAsync()
的实例方法。但是,这个实例方法是有效的
指向不存在签名为ReadAsAsync()的实例方法的引用链接。。。
有一个静态方法HttpContentExtensions.ReadAsAsync(myContent)
其中myContent
指的是HttpContent
对象。这种静态方法也有效
参考链接。。。
例如,一个记录的签名具有
静态图标后接ReadAsAsync(HttpContent)
以及一个说明,说明它将返回任务
。此静态方法可能是实例方法的幕后实现
然而,在静态方法网页的顶部有信息表明。。。
“我们不再定期更新此内容。有关如何支持此产品、服务、技术或API的信息,请查看Microsoft产品生命周期。”
在.NET Core 3.1中,实例和静态两种形式的HttpContent.ReadAsAsync()是否已被取代?我无法从代码中判断它是否是实例方法,但可能是
您包含的链接在.NET4.x和.NETCore之间交替出现,您是否意识到这一点尚不清楚。用日期标记它们意味着一个线性过程,但我们有一个岔路口
也就是说,它被“降级”为驻留在一个额外的包中,因为它将被更少地使用。在.NETCore中,我们现在有了直接作用于HttpClient的类似扩展方法
为了在.NETCore3.x中使用它,您可能需要添加System.net.Http.Json
nuget包。这些扩展只适用于System.Text.Json
,对于Newtonsoft,您必须使用传统的代码模式
截至2020年7月,.NET Core 3.1在线文档中似乎没有HttpClientJsonExtensions。我最近使用的东西,我必须安装Newtonsoft.Json
string responseContent = await response.Content.ReadAsStringAsync();
var productResult = JsonConverter.DeserializeObject<Product>(responseContent);
string responseContent=wait response.Content.ReadAsStringAsync();
var productResult=JsonConverter.DeserializeObject(responseContent);
事实上,我在微软关于如何使用RESTAPI的文档中发现了这一点,而且很有效。您的代码在get部分是正常的,假设它具有正确的Uri
还有一点需要注意的是我的代码不是静态的其他答案不正确
ReadAsAsync方法是System.Net.Http.Formatting.dll的一部分
这又是nuget的一部分:Microsoft.AspNet.WebApi.Client
我刚刚创建了一个新的控制台项目.NETCore3.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;
}
}
}
使用系统;
使用System.Net.Http;
使用System.Net.Http.Header;
使用System.Threading.Tasks;
命名空间Custom.ApiClient
{
内部静态类WebAPI管理器
{
//private const string _requestHeaderBearer=“Bearer”;
私有常量字符串_responseFormat=“application/json”;
私有静态只读HttpClient\u客户端;
静态webapimager()
{
//设置客户端。
_client=newhttpclient{BaseAddress=newuri(“这里是api url”),Timeout=newtimespan(0,0,0,0,-1)};
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(_responseFormat));
//添加此应用程序的API承载令牌标识符。
//_client.DefaultRequestHeaders.Add(requestHeaderBeaer、ConfigHelper.ApiberToken);
}
公共静态异步任务Get()
{
var response=_client.GetAsync(“api额外路径和查询参数转到此处”);
返回等待处理响应(response);
}
专用静态异步任务ProcessResponse(任务响应任务)
{
var httpResponse=等待响应任务;
如果(!httpResponse.IsSuccessStatusCode)
抛出新的HttpRequestException(httpResponse.ToString());
var dataResult=await httpResponse.Content.ReadAsAsync();
返回数据结果;
}
}
}
更新:
清除有关包Microsoft.AspNet.WebApi.Client的依赖项的一些混淆
这是一张从2020年10月27日起显示依赖关系的图片,清楚地表明它依赖于Newtonsoft JSON 10或更高版本。到目前为止,还没有使用System.Text.Json替换ReadAsAsync的版本。。。因此,您可以使用ApiClient+Newtonsoft Json,也可以使用System.Text.Json创建自己的Json
如果您不想安装第三方nuget软件包,那么为其实现扩展方法并不太困难
例如,使用System.Text.Json
:
使用System.Net.Http;
使用System.Text.Json;
使用系统