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

2024-03-29

当使用 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(使用前将#替换为@)

如何在 Http 响应完成之前读取响应流 的相关文章

随机推荐

  • 如何为 SwiftUI 列表中的各个行设置动画?

    我想显示一个列表 其中每一行都显示不透明动画并且延迟逐渐增加 因此 第一行应在 0 1 秒后出现 第二行应在 0 3 秒后出现 第三行应在 0 5 秒后出现 依此类推 我尝试了以下方法 但它不起作用 因为所有行都会同时出现并且没有动画 任何
  • 分布式环境中会话ID的唯一性?

    我们正在使用 Spring Session 由关键的 Gemfire 备份 来运行在分布式环境中的 Spring Boot 应用程序 在这样的分布式环境中 Spring Session 是否确保新的会话使用唯一的会话 id 跨不同 JVM
  • 图表中的最小损坏成本

    给定一个图 G V E 其中有 N 个节点 编号从 0 到 N 1 并且恰好为 N 1 双向边缘 图中的每条边都有一个正成本 C u v 边缘权重 整个图是这样的任何一对节点之间都有唯一的路径 我认为改进的 Kruskal 是正确的选择 取
  • DateTimePicker 永远不会更新!

    我有一些DateTimePicker是一种永不更新的形式 我试过了Value and Text Invalidate 进而Update 并且Refresh 从当前日期开始 他们的价值观似乎没有任何改变 无论我设置什么 当前日期都是 相对 今
  • 自动登录其他网站的php脚本

    我想要一个脚本 通过它我可以登录其他网站而无需打开他们的登录页面 场景是这样的 我不想将登录 ID 和密码提供给他人 他们只需单击链接或按钮 脚本就会完成其工作 它将传递所需的登录 ID 和密码 并提交登录表单并登录 并且客户端拥有所有凭据
  • 如何使用单个bat文件传递动态参数来运行一个exe

    我需要运行一个 EXE 它将采用 7 个参数 其中一个参数是动态的 有人可以帮助我如何通过使用bat文件传递动态参数来运行EXE吗 谢谢 柴塔尼亚 如果您需要执行带有动态数量参数的命令 您可以使用 命令示例 foo exe options
  • C 变量名定义中使用下划线的原因是什么?

    我试图了解开发人员何时需要定义C前面带有 的变量 其原因何在 例如 uint32 t xyz 0 也许这有帮助 来自 C99 7 1 3 保留标识符 所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途 所有以下划线开头
  • 如何解释 Google perf 工具 CPU 分析器中的地址

    我的 C 程序消耗大量 CPU 并且在运行时消耗更多 我使用 Google 性能工具来分析 CPU 使用情况 这就是我得到的结果 pprof top Total 1343 samples 1330 99 0 99 0 1330 99 0 0
  • 是否可以让ScrollView滚动到底部?

    对于一个类似聊天的应用程序 我想保留一个ScrollView组件滚动到底部 因为最新消息出现在旧消息下方 我们可以调整a的滚动位置吗ScrollView For React Native 0 41 及更高版本 您可以使用内置的scrollT
  • 如何获取 Spring Boot 应用程序建立的活动数据库连接数

    我已经使用 Oracle 数据源构建了一个 Spring Boot 应用程序 我需要在日志语句中打印总活动连接 如何获取活动连接 注意 不是最大活动连接数 它应该是 特定时间 实例的活动连接数 DataSource dataSource D
  • iOS 金属线宽

    我想设置我在金属中绘制的线条的宽度 我可以设置一个点的大小point size正如所解释的here https developer apple com library prerelease ios documentation Metal R
  • node js 从 URL 获取 Zip 并上传到 Google 云端硬盘

    我正在尝试从网址获取 zip 文件 以便在下一步中将其上传到 Google 云端硬盘 但我的代码不起作用 The method to get the zip File from the url function getFile var fi
  • python Tkinter() 如何隐藏 UI

    嗨 我正在使用 Tkinter 在 python 中开发单个登录 我只希望当用户正确登录时 登录 UI 将被隐藏 内容 UI 将显示 所以我认为 ui 可以隐藏或者可见性将被隐藏 例如我有这个代码 def httpGETCheck user
  • Magento - 重新索引过程存在问题 - 目录产品 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我刚刚重新索引了运行 v1 6 的 Magenot 安装上的数据 现在我收到一条消息 指出 There was a pr
  • 图像/视频序列中的模糊检测

    我在 photo stackexchange 上问过这个问题 但认为它也可能在这里相关 因为我想在我的实现中以编程方式实现这个问题 我正在尝试为我的成像 管道实现模糊检测算法 我想要检测的模糊是 1 相机抖动 当快门速度较低时 用手移动 抖
  • Oracle 12c - 删除表和所有关联的分区

    我在 Oracle 12c 中创建了表 t1 表有数据 它在列表分区上分区 并且还有子分区 现在我想删除整个表和所有关联的分区 和子分区 这是删除全部的正确命令吗 DROP TABLE t1 PURGE 语法是正确的 但不是优选的 只需删除
  • 将字符串标记为 HTML 安全

    我正在尝试构建我的第一个 Rails 应用程序 并且正在使用瑞恩 希思 Ryan Heath 的 navigation helper https github com rpheath navigation helper插件为我提供导航中的当
  • VSCode python 扩展:如何禁用插入导入语句的自动完成功能?

    在 VS Code 的 Python 扩展中 我有时发现自动完成功能可以包含尚未导入到我正在编辑的文件中的选项 当选择这些选项之一时 导入有时会在没有通知的情况下插入到模块的顶部 虽然我可以看到此功能中的实用程序 但我不太喜欢这种行为 因为
  • x86 区分指令和数据的方法

    是否有一种或多或少可靠的方法来判断内存中某个位置的数据是处理器指令的开头还是其他数据 例如 E8 3F BD 6A 00 may be call操作说明 E8 相对偏移量为0x6ABD3F 或者它可能是属于其他指令的三个字节的数据 后跟pu
  • 如何在 Http 响应完成之前读取响应流

    当使用 HttpWebRequest 对象发出请求时 我需要调用方法 GetResponse 来发送请求并获取响应 此方法的问题是 在收到所有数据之前 它不会返回响应对象 假设我正在下载一个 100 MB 的文件 在响应完成并且所有 100