首页 > 解决方案 > 如何将 System.IO.Stream 放入控制台?

问题描述

System.IO.Stream从这里得到了一个

HttpClient client = new HttpClient();
HttpContent content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var webRequest = new HttpRequestMessage(HttpMethod.Post, targetUrl);
webRequest.Content = content;
var response = client.Send(webRequest);

现在我想用我的眼睛看看那个反应是什么。我试过:

Console.WriteLine(response.Content);

当然,这太容易了,所以它不起作用。

然后

var f___ = new System.IO.StreamReader(response.Content.ReadAsStream()).ReadToEnd();
Console.WriteLine("Response:    " + f___);

没有骰子,只有一个空字符串。

甚至试图发挥创造力...

response.Content.CopyTo(Console);

但这甚至无法编译。

我唯一要工作的是Console.WriteLine("Headers " + response.Headers.ToString());,它有一个content-length,所以我期待一些东西。

标签: c#

解决方案


您应该检查Content-Length标头并验证是否确实有要从内容流中读取的内容:

response.Content.Headers.ContentLength

也许您正在使用另一个 API 读取响应的内容,因此将流位置留在流的末尾?您可以尝试寻找开头然后阅读流:

stream.Seek(0, SeekOrigin.Begin);

有多种方法可以读取流内容,其中一些您已经尝试过:

using System.IO;
using System.Text;
using System.Threading.Tasks;

// StreamReader
using var reader = new StreamReader(stream, Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());

// Stream.CopyTo
stream.CopyTo(Console.OpenStandardOutput());

// Stream.Read
var length = (int) response.Content.Headers.ContentLength;
var buffer = new byte[length];
var count = stream.Read(buffer, 0, buffer.Length);
var text = Encoding.UTF8.GetString(buffer, 0, count);

Console.WriteLine(text);

// HttpContent.ReadAsStringAsync
var text = await response.Content.ReadAsStringAsync();
Console.WriteLine(text);

// HttpContent.ReadAsByteArrayAsync
var buffer = await response.Content.ReadAsByteArrayAsync();
var text = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
Console.WriteLine(text);

推荐阅读