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

前端之家收集整理的这篇文章主要介绍了c# – 如何在Http响应完成之前读取响应流前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用HttpWebRequest对象发出请求时,我需要调用方法GetResponse()来发送请求并获取响应.
方法的问题在于,在收到所有数据之前,它不会返回响应对象.假设我正在下载一个100 MB的文件,在响应完成并且下载了所有100 MB之前,我将无法读取它.
我想要的是能够在它们到达时立即读取响应流字节,而无需等待响应完成.
我知道我可以使用Range Http标头,但它不适用于我的情况.

解决方法

我认为这与@Zachary建议的非常接近.它(似乎)工作;实际上我认为使用@Zachary使用甚至“更好”.
我的主要观点是我看不到你(似乎)描述的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,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#相关文章