gpt4 book ai didi

c# - 如何在 Http 响应完成之前读取响应流

转载 作者:太空狗 更新时间:2023-10-29 21:07:16 25 4
gpt4 key购买 nike

当使用 HttpWebRequest 对象发出请求时,我需要调用方法 GetResponse() 来发送请求并获取响应。
此方法的问题在于它在接收到所有数据之前不会返回响应对象。假设我正在下载一个 100 MB 的文件,我将无法读取它,直到响应完成并且所有 100 MB 都已下载。
我想要的是能够在响应流字节到达时立即读取它们,而无需等待响应完成。
我知道我可以使用 Range Http header ,但它不适用于我的情况。

最佳答案

我认为这与@Zachary 的建议非常接近。它(似乎)有效;实际上,我认为像@Zachary 那样使用 using 甚至“更好”。
我的主要观点是我看不到您(似乎)描述的 GetResponse() 的阻塞行为。

此外,下面的代码只是粗略地展示了一切是如何工作的;例如,它不会读取流到最后(除非是巧合 :))。但是,如果您将它复制并粘贴到 Visual Studio 中的空“控制台应用程序”项目中,它应该可以工作。

您可以尝试使用一些“较短”的 URL 进行测试。此处的示例开始下载 debian 发行版的 ISO(略多于 600 MByte)。 抱歉,debian,我不是有意窃取你的带宽。 -> 顺便说一句:有没有什么可以用来测试这种情况的合理方法?

代码的强烈灵感来自 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));
}
}
}

关于c# - 如何在 Http 响应完成之前读取响应流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2841974/

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