HttpWebResponse以不均匀的块读取流

时间:2016-11-22 20:21:39

标签: c# .net .net-4.0 streaming httpwebrequest

我正在使用HttpWebRequest.GetResponse().GetResponseStream()中的流来读取流式网络API中的数据。我在流上使用Begin / EndRead,缓冲区为65K字节。我可以看到以下列模式返回数据:

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的返回值。

BTW这是在.NET 4.0上,没有HttpClient。

1 个答案:

答案 0 :(得分:-1)

您要通过将HTTPWebRequest发送到目标服务器来实现什么目标?

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

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

转换为UTF-8后,您现在可以将输出流打印为字符串值,您可以将其输出到控制台或输出输出字符串的任何位置!

我希望这就是你想要的,如果不是那么我本来就没用了! :P