C# HttpWebResponse流在不均匀块中读取

C# HttpWebResponse流在不均匀块中读取,c#,.net,.net-4.0,streaming,httpwebrequest,C#,.net,.net 4.0,Streaming,Httpwebrequest,我正在使用来自HttpWebRequest.GetResponse().GetResponseStream()的流从流式web API读取数据。我在具有65K字节缓冲区的流上使用Begin/EndRead。我可以看到数据以以下模式返回: 16383 bytes read. 1 bytes read. 16383 bytes read. 1 bytes read. 16383 bytes read. 1 bytes read. etc... 显然,1字节的读取在这个过程中带来了很多低效,我提供的

我正在使用来自
HttpWebRequest.GetResponse().GetResponseStream()
的流从流式web API读取数据。我在具有65K字节缓冲区的流上使用
Begin
/
EndRead
。我可以看到数据以以下模式返回:

16383 bytes read.
1 bytes read.
16383 bytes read.
1 bytes read.
16383 bytes read.
1 bytes read.
etc...
显然,1字节的读取在这个过程中带来了很多低效,我提供的缓冲区大小足够容纳16384字节或更多。作为一个客户端,我能做些什么来改进这一点,还是仅仅取决于服务器如何将数据流传送给我

读卡器代码基本上是:

var buffer = new byte[65536];
using (var stream = response.GetResponseStream()) {
    while (true) {
        var bytesRead = await AsyncRead(stream.BeginRead, stream.EndRead, buffer);
        Console.WriteLine($"{bytesRead} bytes read.");
        // do something with the bytes
    }
}
其中AsyncRead只调用
BeginRead(buffer,0,buffer.Length,callback,null)
,然后在回调中调用
EndRead
,并返回
EndRead
的返回值


顺便说一句,这是在.NET 4.0上,没有HttpClient。

通过将HTTPWebRequest发送到目标服务器,您到底想要实现什么

在向服务器请求数据或初始化客户端应用程序与目标服务器之间的请求后,是否尝试从服务器读取实时响应?如果您尝试向目标服务器发送HTTPWepRequest和HTTPWebResponse,则将服务器提供的响应转换为流,然后使用System.IO.StreamReader读取即将到来的流

然后,为了安全起见,如果这是您的总体目标,请将System.IO.StreamReader方法读取的流转换为UTF-8

转换为UTF-8后,您现在可以将输出流打印成字符串值,您可以将其输出到控制台或任何您想要发送输出字符串的地方


我希望这是你想要的,如果不是的话,我基本上是无用的P

我不确定1字节是否会降低效率,因为http连接应该保持打开状态,并且数据传输可能比读取该字节的cpu开销慢得多。然而,这是一种奇怪的行为。你能发布相关的阅读器代码吗?@Stefan,当然,它实际上是F#使用不同的异步实现,但我已经翻译过了。异步代码没有什么特别之处,它只是按原样传递参数和返回值。胡乱猜测:罪魁祸首是压缩或加密。尝试在
HttpWebRequest
上关闭(或打开)压缩。同样,查看
http
https
连接上的行为是否相同。我相信TLS以2^14字节大小的块(即16384字节)发送数据。@ChrisR.Timmons我确实在使用HTTPS;这是一个要求,但没有办法绕过它。将检查启用压缩是否有帮助,谢谢。您是否对http流量进行了调整,以查看1字节数据带来了什么?通过StreamReader读取应该如何帮助解决我的问题?“通过将HTTPWebRequest发送到目标服务器,您到底想实现什么?”-如前所述,从流式web API获取数据。如果您试图读取服务器发送的数据,那么您希望这样做,我只是提供了一个选项,以防您需要它!我正在从服务器读取数据,一切正常!恐怕你不明白这个问题,不过还是谢谢你。