217

我正在尝试获取 HttpResponseMessage 的内容。它应该是:{"message":"Action '' does not exist!","success":false},但我不知道如何从 HttpResponseMessage 中获取它。

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!

在这种情况下 txtBlock 将具有价值:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: Accept-Encoding
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Date: Wed, 10 Apr 2013 20:46:37 GMT
  Server: Apache/2.2.16
  Server: (Debian)
  X-Powered-By: PHP/5.3.3-7+squeeze14
  Content-Length: 55
  Content-Type: text/html
}
4

10 回答 10

463

我认为最简单的方法就是将最后一行更改为

txtBlock.Text = await response.Content.ReadAsStringAsync(); //right!

这样你就不需要引入任何流阅读器,也不需要任何扩展方法。

于 2015-04-07T10:47:17.987 回答
77

您需要调用GetResponse()

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();
于 2013-04-10T20:58:22.500 回答
43

试试这个,你可以像这样创建一个扩展方法:

    public static string ContentToString(this HttpContent httpContent)
    {
        var readAsStringAsync = httpContent.ReadAsStringAsync();
        return readAsStringAsync.Result;
    }

然后,简单地调用扩展方法:

txtBlock.Text = response.Content.ContentToString();

我希望这对你有帮助;-)

于 2015-01-13T15:54:58.670 回答
15

如果您想将其转换为特定类型(例如在测试中),您可以使用ReadAsAsync扩展方法:

object yourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType));

或以下同步代码:

object yourTypeInstance = response.Content.ReadAsAsync(typeof(YourType)).Result;

更新:还有ReadAsAsync<>的通用选项,它返回特定类型的实例而不是对象声明的实例:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();
于 2017-02-06T17:15:03.447 回答
6

通过 rudivonstaden 的回答

txtBlock.Text = await response.Content.ReadAsStringAsync();

但如果您不想使方法异步,您可以使用

txtBlock.Text = response.Content.ReadAsStringAsync();
txtBlock.Text.Wait();

Wait() 这很重要,因为我们正在执行异步操作,我们必须等待任务完成才能继续。

于 2018-10-26T12:11:31.397 回答
5

我建议的快速答案是:

response.Result.Content.ReadAsStringAsync().Result

于 2020-01-21T17:44:43.197 回答
1

我认为下图有助于那些需要T作为返回类型的人。

在此处输入图像描述

于 2020-01-16T15:24:41.087 回答
0

您可以使用以下GetStringAsync方法:

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
于 2016-09-05T08:04:53.820 回答
0

截至 2022 年 2 月的更新答案:

var stream = httpResponseMessage.Content.ReadAsStream();
var ms = new MemoryStream();
stream.CopyTo(ms);
var responseBodyBytes = ms.ToArray();
于 2022-02-20T15:16:29.083 回答
0

使用块:

using System;
using System.Net;
using System.Net.Http;

此函数将创建新的 HttpClient 对象,将 http-method 设置为 GET,将请求 URL 设置为函数“Url”字符串参数,并将这些参数应用于 HttpRequestMessage 对象(定义 SendAsync 方法的设置)。最后一行:函数向指定的 url 发送异步 GET http 请求,等待响应消息的 .Result 属性(只是完整响应对象:headers + body/content),获取该完整响应的 .Content 属性(请求正文,没有 http headers),将 ReadAsStringAsync() 方法应用于该内容(这也是某种特殊类型的对象),最后,再次使用 .Result 属性等待此异步任务完成,以获得最终结果字符串,然后返回此字符串作为我们的函数返回。

static string GetHttpContentAsString(string Url)
    {   
        HttpClient HttpClient = new HttpClient();
        HttpRequestMessage RequestMessage = new HttpRequestMessage(HttpMethod.Get, Url);
        return HttpClient.SendAsync(RequestMessage).Result.Content.ReadAsStringAsync().Result;
    }

较短的版本,它不显示我们的 http 请求的完整“转换”路径,并使用 HttpClient 对象的 GetStringAsync 方法。函数只是创建 HttpClient 类的新实例(一个 HttpClient 对象),使用 GetStringAsync 方法将我们的 http 请求的响应正文(内容)作为异步任务结果\承诺,然后使用该异步任务结果的 .Result 属性获取最终字符串,然后简单地将这个字符串作为函数返回返回。

static string GetStringSync(string Url)
    {
        HttpClient HttpClient = new HttpClient();
        return HttpClient.GetStringAsync(Url).Result;
    }

用法:

const string url1 = "https://microsoft.com";
const string url2 = "https://stackoverflow.com";

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; /*sets TLC protocol version explicitly to modern version, otherwise C# could not make http requests to some httpS sites, such as https://microsoft.com*/

Console.WriteLine(GetHttpContentAsString(url1)); /*gets microsoft main page html*/
Console.ReadLine(); /*makes some pause before second request. press enter to make second request*/
Console.WriteLine(GetStringSync(url2)); /*gets stackoverflow main page html*/
Console.ReadLine(); /*press enter to finish*/

完整代码:

在此处输入图像描述

于 2021-09-01T16:00:34.413 回答