繁体   English   中英

有 HttpContent.ReadAsAsync<t> .NET Core 中的方法已被取代?</t>

[英]Has HttpContent.ReadAsAsync<T> method been superceded in .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#)

链接... https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

在文档中是 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 object。 截至 2020 年 7 月, HttpContent没有签名ReadAsAsync<T>()的实例方法,至少根据以下文档。 但是,此实例方法有效。

没有带有签名的实例方法的参考链接ReadAsAsync ReadAsAsync<T>() ... -3.1

有一个 static 方法HttpContentExtensions.ReadAsAsync<T>(myContent)其中myContent指的是HttpContent object。 此 static 方法也有效。

参考链接... https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834253(v=vs.118)

例如,一个记录在案的签名具有...

static 图标后跟ReadAsAsync<T>(HttpContent)

以及说明它将返回Task<T>的描述。 这个 static 方法可能是实例方法的幕后实现。

但是,static 方法网页顶部的信息表明...“我们不再定期更新此内容。请查看 Microsoft 产品生命周期以获取有关如何支持此产品、服务、技术或 API 的信息。

forms 实例和 static 的HttpContent.ReadAsAsync<T>()是否已在 .NET Core 3.1 中被取代?

我无法从代码中判断它是否曾经是实例方法,但它可能是。

您包含的链接在.net 4.x.net core之间交替,不清楚您是否知道这一点。 用日期标记它们表明线性进展,但我们有一个岔路口。

仅此而已,它被“降级”为驻留在额外的 package 中,因为它将减少使用。 在 .net 核心中,我们现在有类似的扩展方法直接作用于 HttpClient。


In order to use this with .net core 3.x you may have to add the System.Net.Http.Json nuget package. 扩展仅适用于System.Text.Json ,对于 Newtonsoft,您将不得不使用传统的代码模式。


截至 2020 年 7 月,.NET Core 3.1 在线文档中似乎没有 HttpClientJsonExtensions。

其他答案不正确。

ReadAsAsync 方法是 System.Net.Http.Formatting.dll 的一部分

这又是 nuget 的一部分: Microsoft.AspNet.WebApi.Client

我刚刚创建了一个新的 Console project.Net Core 3.1 并添加了 2 个 nugets

  1. 牛顿软件
  2. 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;
        }
    
    }
}

更新:

清除有关 package Microsoft.AspNet.WebApi.Client 的依赖项的一些混淆

这是一张显示截至 2020 年 10 月 27 日的依赖项的图片,这些依赖项清楚地表明它依赖于 Newtonsoft JSON 10 或更高版本。 到今天为止,没有使用 System.Text.Json 替换 ReadAsAsync... 所以您可以使用 ApiClient + Newtonsoft Json 或使用 System.Text.ZEED8D85B888A6C0158342408 创建自己的

在此处输入图像描述

我最近使用的东西,我必须安装 Newtonsoft.Json

string responseContent = await response.Content.ReadAsStringAsync();
var productResult = JsonConverter.DeserializeObject<Product>(responseContent);

实际上,我在有关如何使用 REST API 的 Microsoft 文档中发现了这一点,并且它起作用了。 你的代码在获取部分没问题,假设它有正确的 Uri,

还有一点是我的代码不是 static

如果您不想安装第三方 nuget 包,为此实现扩展方法并不难。

例如,使用System.Text.Json

using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public static async Task<T> ReadAsAsync<T>(this HttpContent content) {
    string contentString = await content.ReadAsStringAsync();
    JsonSerializerOptions options = new JsonSerializerOptions {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    };
    return (T)JsonSerializer.Deserialize(contentString, typeof(T), options);
}

暂无
暂无

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

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