2

我有这个代码,调用游戏 Guild Wars 2 的这个示例 API 调用

        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 以获得正确、完整的响应?

4

1 回答 1

4

对流的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();
}
于 2013-10-23T12:05:33.757 回答