c# - HttpWebRequest 部分获取数据失败

标签 c# httpwebrequest

我有这个代码,调用 this sample API call of the game Guild Wars 2

        HttpWebRequest request = HttpWebRequest.Create("https://api.guildwars2.com/v1/events.json?world_id=1001") as HttpWebRequest;
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;

        byte[] bytes = new byte[response.ContentLength];
        Stream stream = response.GetResponseStream();
        stream.Read(bytes, 0, bytes.Length);
        string result = Encoding.Default.GetString(bytes);

这是对官方激战 2 API 的示例调用,应该以 JSON 格式返回事件列表及其状态。

如果您在浏览器中调用该地址并将数据粘贴到文本编辑器中,它会给出正确的 JSON 字符串,略多于 300 kb。

但是,当通过此代码调用并查看生成的字节数组时,前 3800-3900 字节已正确填充(数字因调用而异),但其余部分全部为零。

response.ContentLength 指示流的正确长度,略高于 300k,并且使用 stream.ReadByte() 进行测试告诉我流确实提供了这 300k,它只是在 3850 字节标记之后的零。

我的代码是否有错误,或者什么可能导致此问题?我可以以其他方式调用 API 以获得正确、完整的响应吗?

最佳答案

流上的Read操作返回实际读取的字节数。您应该继续调用 stream.Read() 直到它返回 0。数据只是还没有到达。

Read 不会阻塞的原因是某些应用程序可能已经开始处理部分数据。

您可以使用以下代码:

HttpWebRequest request = HttpWebRequest.Create("https://api.guildwars2.com/v1/events.json?world_id=1001") as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

byte[] bytes;
using (Stream stream = response.GetResponseStream())
using (MemoryStream buffer = new MemoryStream((int)response.ContentLength))
{
    byte[] chunk = new byte[4096];
    int bytesRead;
    while ((bytesRead = stream.Read(chunk, 0, chunk.Length)) > 0)
    {
        buffer.Write(chunk, 0, bytesRead);
    }
    bytes = buffer.ToArray();
}

关于c# - HttpWebRequest 部分获取数据失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19541055/

相关文章:

c# - 快速字符串到 byte[] 的转换

.NET 网络爬虫需要测量 Time To First Byte of HttpWebResponse

c# - 带有自定义 header 的 Windows Phone 8 Http 请求

c# - 为什么对同步请求使用 HttpClient 而不是 HttpWebRequest

c# - 在 C# 中没有多个定义的设计

c# - 在 Windows 窗体开发中更改 C# 用户控件布局

c# - 一张表中的一条记录与另一张表中的多条记录之间的关系

c# - 提供一系列唯一数字的好方法是什么(C# vs Sql)?

c# - 如何检测一个 URL 是否重定向到另一个 URL?

c# - 来自 wcf 服务的 Httpwebrequest