ChatGPT解决这个技术问题 Extra ChatGPT

HttpContent.ReadAsAsync 在哪里?

我在网络上使用新 HttpClient 对象(作为新 Web API 的一部分)的大量示例中看到应该有 HttpContent.ReadAsAsync<T> 方法。但是,MSDN 没有提到这种方法,IntelliSense 也没有找到它。

它去了哪里,我该如何解决?


C
Chris Marisic

看起来它是一个扩展方法(在 System.Net.Http.Formatting 中):

HttpContentExtensions Class

更新:

PM> 安装包 Microsoft.AspNet.WebApi.Client

根据 System.Net.Http.Formatting NuGet 包页面,System.Net.Http.Formatting 包现在是旧版,可以在 NuGet here 上可用的 Microsoft.AspNet.WebApi.Client 包中找到。


这在最新的客户端 Nugets 中是否已被弃用?现在找不到(以前可以)。
很可能是这样。 .NET4.5 添加了很多关于异步/任务(等待等)的新内容,因此这些扩展可能不再是必需的。我可能会在这里看看,例如:msdn.microsoft.com/en-us/library/…
@georgiosd我刚刚更新了答案。与此同时,System.Net.Http.Formatting 似乎已移至 nuget.org/packages/Microsoft.AspNet.WebApi.Client 包。
那么原始问题 HttpContent.ReadAsAsync<T> 中的方法是否不在 Microsoft.AspNet.WebApi.Client 中?建议的替换是什么?
@JedatKinports 很确定它不会。 WebAPI.Client 包需要 .NET 4.5。我认为旧的 HttpContentExtensions 用于 .NET 4.0
r
rosta

我有同样的问题,所以我只需获取 JSON 字符串并反序列化到我的类:

HttpResponseMessage response = await client.GetAsync("Products");
//get data as Json string 
string data = await response.Content.ReadAsStringAsync();
//use JavaScriptSerializer from System.Web.Script.Serialization
JavaScriptSerializer JSserializer = new JavaScriptSerializer();
//deserialize to your class
products = JSserializer.Deserialize<List<Product>>(data);

除了这不能回答问题之外,为什么这会被否决?它不是 ReadAsAsync 的合理替代方案吗?
可能是因为您没有回答扩展方法去了哪里的问题。自己写是一个糟糕的解决方法
它不一定是一个糟糕的解决方法,它是本地化的,因此不太可能在未来的 nuget 更新等中被破坏。我完全赞成。
这假设响应具有 JSON 内容类型。
伙计们——这很清楚地回答了 1/2 的问题——“我该如何解决它”。 +1+1(另一个加一代表我给那些认为这个答案有用的人的三个加号!)
M
Martin Brandl

如果您已经在使用 Newtonsoft.Json 并且不想安装 Microsoft.AspNet.WebApi.Client

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());

这就是我最终做的。由于不支持“允许字符串属性的非字符串 JSON 值”,因此尝试使用新的 System.Text.Json 证明太麻烦了。
M
Mangesh

2021 年更新:看起来该方法已在 .NET5 中删除。或者,您可以使用 System.Net.Http.Json.HttpContentJsonExtensions 中的 ReadFromJsonAsync<>()。它解决了目的。


V
Vasya Milovidov

您可以编写扩展方法:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}

这就是我最终要做的——我不会为 2 行方法拖动整个 DLL。
@VasyaMilovidov 感谢您分享您的代码。在您提出建议之前,我花了几个小时没有任何成功。你的建议对我的需要很有帮助。正如 @Liz 所提到的,无需使用不必要的 DLLS 安装 Microsoft.AspNet.WebApi.Client(至少在我的场景中)。
I
Ivan Carmenates García

只需在您的项目中右键单击 Manage NuGet Packages 搜索 Microsoft.AspNet.WebApi.Client 安装它,您将可以访问扩展方法。


谁在抱怨什么?
T
Tom John

几次点击这个并遵循了一堆建议,如果您在安装 NuGet Microsoft.AspNet.WebApi.Client 后发现它不可用,请手动从解决方案中的包文件夹中添加一个引用:

\Microsoft.AspNet.WebApi.Client.5.2.6\lib\net45\System.Net.Http.Formatting.dll

并且不要陷入向 System.Net.Http.Formatting.dll NuGet 添加旧引用的陷阱


S
Sercan

尽管我遇到了同样的问题,但该线程中的答案并没有完全帮助我解决问题。出于这个原因,我决定在这篇文章中写下我的研究结果。要解决此问题,请按照以下步骤操作:

使用 NuGet 将 Microsoft.AspNet.WebApi.Client 包添加到项目中。在 ASP.NET 解决方案中,通过转到 Visual Studio IDE 中的工具 > NuGet 包管理器 > 包管理器控制台打开包管理器控制台,并将 Microsoft.AspNet.WebApi.Client 包添加到解决方案中。

Install-Package Microsoft.AspNet.WebApi.Client -Version 5.2.7

安装后,检查系统上是否存在扩展 DLL。作为第一步的结果,System.Net.Http.Formatting.dll 文件应该存在于下面显示的目录中。

{root-solution-directory}\packages\Microsoft.AspNet.WebApi.Client.{package-version}\lib\net45\

手动添加对相关项目的引用。右键单击解决方案中 ASP.NET 项目中的“引用”部分,单击“添加引用...”部分。由于文件 System.Net.Http.Formatting.dll 是扩展名,因此在直接搜索时不会像 Microsoft.AspNet.WebApi.Client 包中的其他项一样列出它。因此,要手动添加 DLL 文件,请单击“参考管理器”窗口底部的“浏览...”按钮。选择第二步所示目录中的 System.Net.Http.Formatting.dll 文件并勾选复选框以将 DLL 文件包含在项目中。在项目中包含 System.Net.Http 命名空间,以便在项目中使用此 DLL 提供的功能;使用 System.Net.Http.Formatting;声明在 HttpContentExtensions 静态类中可用。

using System.Net.Http;

可选:您可以通过安装 System.Net.Http.Formatting.ExtensionWebApiDoodle.Net.Http.Formatting 软件包之一并执行上述步骤来实现类似的解决方案。