1 回答

TA贡献1795条经验 获得超7个赞
我不熟悉 C# 但如果我正确理解了您的代码和ReadC# 中的语义(这似乎与readC 中的相似),那么问题是您一次又一次地使用相同的缓冲区而没有先重置它:
byte[] buffer = new byte[blockLengthInt];
int totalBytesRead = 0;
while (totalBytesRead != blockLengthInt) {
int length = blockLengthInt - totalBytesRead;
int bytesRead = _receiverHelper.HasData ? _receiverHelper.Read(buffer, 0, length) : _request.ClientStream.Read(buffer, 0, length);
...
totalBytesRead += bytesRead;
...
yield return buffer;
}
举例说明这里出了什么问题:假设块大小为 10,您读取的内容是0123456789,第一次读取将返回 6 个字节,第二次读取剩余的 4 个字节。在这种情况下,您的缓冲区将012345在第一次读取567845之后和第二次读取之后。这些45在缓冲区末尾量与上一读,因为你只是取代了缓冲区中的第4个字节,但保留了休息。
奇怪的是,如果我将请求交给另一个 TCPStream 代理(127.0.0.1:8888 作为代理,它是提琴手),它工作得非常好......
Fiddler 是一个代理,可能会改变响应的传输方式。例如,它可能使用Content-length分块编码而不是分块编码,或者它可能使用较小的块,以便您始终在第一次读取时获得完整的块。
- 1 回答
- 0 关注
- 193 浏览
添加回答
举报