当使用 HttpWebRequest 对象发出请求时,我需要调用方法 GetResponse() 来发送请求并获取响应。
此方法的问题是,在收到所有数据之前,它不会返回响应对象。假设我正在下载一个 100 MB 的文件,在响应完成并且所有 100 MB 都下载完毕之前我将无法读取它。
我想要的是能够在响应流字节到达时立即读取它们,而无需等待响应完成。
我知道我可以使用 Range Http 标头,但它不适用于我的情况。
我认为这非常接近@Zachary 的建议。它(似乎)有效;实际上我认为使用using
正如@Zachary 所做的那样,甚至“更好”。
我的要点是我看不到的阻塞行为GetResponse()
你(似乎)描述了。
另外,下面的代码只是粗略地展示了一切是如何工作的;它不会读取流到底例如(除非巧合:))。但如果您将其复制粘贴到 Visual Studio 中的空“控制台应用程序”项目中,它应该可以工作。
您可以尝试使用一些“较短”的 URL 进行测试。此处的示例开始下载 debian 发行版的 ISO(略多于 600 MB)。抱歉 debian,我不是故意要窃取你的带宽。-> 顺便说一句:有什么明智的东西可以用来测试这样的场景吗?
该准则的强烈启发C# - 如何通过 HTTP 读取连续的 XML 流 https://stackoverflow.com/questions/775574/c-how-to-read-a-continuous-stream-of-xml-over-http.
namespace StreamReadWebRequest
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
class Program
{
static void Main(string[] args)
{
HttpWebRequest req;
HttpWebResponse res = null;
try
{
req = (HttpWebRequest)WebRequest.Create(
"http://cdimage.debian.org/debian-cd/5.0.4/i386/iso-cd/debian-504-i386-CD-1.iso");
res = (HttpWebResponse)req.GetResponse();
Stream stream = res.GetResponseStream();
byte[] data = new byte[4096];
int read;
while ((read = stream.Read(data, 0, data.Length)) > 0)
{
Process(data, read);
}
}
finally
{
if (res != null)
res.Close();
}
Console.In.Read();
}
private static void Process(byte[] data, int read)
{
Console.Out.Write(ASCIIEncoding.ASCII.GetString(data));
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)