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

C# 如何在Http响应完成之前读取响应流,c#,http,httpwebrequest,httpwebresponse,C#,Http,Httpwebrequest,Httpwebresponse,使用HttpWebRequest对象发出请求时,我需要调用GetResponse()方法来发送请求并返回响应。 此方法的问题在于,在接收到所有数据之前,它不会返回响应对象。假设我正在下载一个100 MB的文件,在响应完成并下载所有100 MB之前,我无法读取该文件。 我希望能够在响应流字节到达时立即读取它们,而无需等待响应完成。 我知道我可以使用范围Http头,但它在我的情况下不起作用。如果您在读取时设置缓冲区大小,您可以分块读取数据。。。例如 // Get the response stre

使用HttpWebRequest对象发出请求时,我需要调用GetResponse()方法来发送请求并返回响应。
此方法的问题在于,在接收到所有数据之前,它不会返回响应对象。假设我正在下载一个100 MB的文件,在响应完成并下载所有100 MB之前,我无法读取该文件。
我希望能够在响应流字节到达时立即读取它们,而无需等待响应完成。

我知道我可以使用范围Http头,但它在我的情况下不起作用。

如果您在读取时设置缓冲区大小,您可以分块读取数据。。。例如

 // Get the response stream
 using(Stream resStream = response.GetResponseStream())
 {

        string parseString = null;
        int    count      = 0;

        do
        {
            // Read a chunk of data
            count = resStream.Read(buf, 0, buf.Length);

            if (count != 0)
            {
                // Convert to ASCII
                parseString = Encoding.ASCII.GetString(buf, 0, count);

                // Append string to results
                sb.Append(tempString);
            }
        }
        while (count > 0);

}

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

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

您可以尝试使用一些“较短”的URL进行测试。这里的示例开始下载debian发行版的ISO(略高于600 MB)。对不起,debian,我不是故意偷你的带宽。->顺便问一下:有什么合理的方法可以用来测试这样的场景吗

该代码的灵感来源于


我不确定你有什么意见,但我知道一个事实(我相信这里很多人都会同意)
GetResponse()
不会将整个文件下载回来。它将发送请求,等待响应,并获取响应头

获得响应后,可以使用
GetResponseStream()
轻松获得响应流,这是从服务器下载的实际数据流。在下载整个文件之前,您可以轻松访问响应流。这是100%真实的和经过测试的

如果您没有得到相同的行为(这真的很奇怪,而且不应该发生),您是否可以添加一个代码示例,该示例不能像我上面解释的那样工作


另外,请测试发布的示例。这再一次证明了它工作得很好,没有任何特殊的漏洞。

我也在寻找同样的东西:服务器流式处理分块的XML数据,我需要一个C#客户机,它可以在服务器流式处理时访问这些数据。我尝试了许多不同的方法来访问源代码(WebChannel Factory、WebClient、HttpWebRequest/Response、TcpClient),但到目前为止都失败了。找到这个线程时,我将重点放在HttpWebRequest/Response上,在这里我遇到了与以下行阻塞相同的问题:

HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
正如Artiom Chilaru所说,如果它是阻塞的:有些事情是错误的,因为它不应该。现在我专注于通过下载大型.ISO文件来复制默认行为,我发现Fiddler正在阻止GetResponse()方法


但是,一旦设置了流(即GetResponse()已被调用),打开Fiddler是没有问题的,但是在HTTP GET过程中,如果发现GetResponse()正在阻塞,请尝试关闭Fiddler并查看应用程序现在是否继续正常流(即读取流)。

这是在响应完成之后,我希望能够在读取所有响应头后立即调用之前读取响应流。GetResponse()或为BeginGetResponse()提供的回调,但是,除非答案很小或者你读过,否则不会阅读整个答案。不清楚OP是否确实测试过任何建议的解决方案,是否面临任何具体问题。根据我的经验,get response stream只获取流,当您从该流读取时,响应将被下载,当然,除非它是一小块!同上。。。谢兰德说:)这正是我的问题。关闭Fiddler后,GetResponse()的行为与预期一致。谢谢我知道这是一条旧线,但加上我的2美分。Fiddler实际上是一个代理服务器,因此它实际上从原始服务器获取整个响应,然后执行您希望它执行的操作。这就是为什么它会阻塞。
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();