gpt4 book ai didi

c# - 为什么 HttpWebResponse 会丢失数据?

转载 作者:太空狗 更新时间:2023-10-29 23:36:54 25 4
gpt4 key购买 nike

在另一个问题中,人们在通过 GetResponseStream() 从 HttpWebResponse 读取数据时得到的数据不完整。

我在从嵌入式设备读取数据时也遇到了这个问题,该设备应向我发送 1000 个输入的配置,所有 32 字节 header 和 64 字节 * 1000 导致 64032 字节数据。

直接读取响应流只给我前 61 个半输入的数据,从那里开始只有零。

版本 a) 不工作:

int headerSize = 32;
int inputSize = 64;
byte[] buffer = new byte[(inputSize*1000) + headerSize];

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buffer, 0, buffer.Length);
}
}

response.Close();
return buffer;

为了使问题形象化,我分别打印了每个输入配置的 64 个字节。它基本上由 40 个 ascii 字符和几个表示 bool 值和整数值的字节组成。

版本 A) 输出:

1/1000 | 46656E7374657220576F686E656E2020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100090010020
2/1000 | 42574D20576F686E656E202020202020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100091010080

61/1000 | 53656E736F72203631202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000
62/1000 | 53656E736F7220363220202020202020202020202020202020202020202020200000000000000000000000000000000000000000000000000000000000000000
63/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

999/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1000/1000 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

当我将 ResponseStream 复制到一个新的 MemoryStream 时,我可以完全读取所有 1000 个输入而没有任何损坏的字节。

版本 B) 完美运行:

(另请参阅 https://stackoverflow.com/a/22354617/6290907,它解决了我在第一种情况下的问题)

int headerSize = 32;
int inputSize = 64;
byte[] buffer = new byte[(inputSize*1000) + headerSize];

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
MemoryStream memStream = new MemoryStream();
stream.CopyTo(memStream);
memStream.Flush();
stream.Close();

memStream.Seek(0, SeekOrigin.Begin);
memStream.Read(buffer, 0, buffer.Length);

memStream.Close();
}
}

response.Close();
return buffer;

版本 B) 输出

1/1000 | 46656E7374657220576F686E656E2020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100090010020
2/1000 | 42574D20576F686E656E202020202020202020202020202020202020202020202020202020202020000000000F0EB0AA00008100000001800000100091010080

61/1000 | 53656E736F72203631202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000
62/1000 | 53656E736F72203632202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000
63/1000 | 53656E736F72203633202020202020202020202020202020202020202020202020202020202020200000000000000000000010003300000000001000C3010000

999/1000 | 53656E736F7220393939202020202020202020202020202020202020202020202020202020202020000000000000000000001000DA030000000010006A050000
1000/1000 | 53656E736F7220313030302020202020202020202020202020202020202020202020202020202020000000000000000000001000DB030000000010006B050000

从技术角度:为什么直接访问 HttpWebResponse 会丢失数据?我不只是希望它工作,但我想了解为什么版本 a 失败而版本 b 成功,而两者都依赖于相同的数据源(response.GetResponseStream())。在这种情况下,幕后发生了什么?

感谢您的努力!

最佳答案

检查 Stream.Read 返回的 int,如 docs 所述:

This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached.

我敢打赌,在第一次调用中只会返回部分流。

如果您重复调用 Stream.Read,您最终会获得所有字节。 http 流的加载速度比您的代码运行速度慢 - 在您调用 Read 之前它没有时间完成。

通过将 CopyToMemoryStream 一起使用,调用会阻塞,直到读取整个流。包装在 StreamReader 中,然后调用 ReadToEnd 将获得相同的成功结果。

关于c# - 为什么 HttpWebResponse 会丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40239836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com