在内容 100% 完成之前从 HttpResponseMessage 读取标头

2024-01-18

  1. 在整个响应被传回之前,如何访问响应标头?
  2. 当流到达时如何读取它?
  3. HttpClient 是接收 http 响应的精细控制的最佳选择吗?

这是一个可以说明我的问题的片段:

using (var response = await _httpClient.SendAsync(request,
  HttpCompletionOption.ResponseHeadersRead))
{
   var streamTask = response.Content.ReadAsStreamAsync();
   //how do I check if headers portion has completed? 
   //Does HttpCompletionOption.ResponseHeadersRead guarantee that?
   //pseudocode
   while (!(all headers have been received)) 
     //maybe await a Delay here to let Headers get fully populated
   access_headers_without_causing_entire_response_to_be_received

   //how do I access the response, without causing an await until contents downloaded?
   //pseudocode
   while (stremTask.Resul.?) //i.e. while something is still streaming
     //? what goes here? a chunk-read into a buffer? or line-by-line since it's http?
   ...


Edit为我澄清另一个灰色地带:
我发现的任何参考文献都有某种阻塞语句,这会导致等待内容到达。我阅读的参考文献通常访问streamTask.Result或内容上的方法或属性,但我不这样做没有足够的知识来排除哪些此类引用是可以的,因为streamTask正在进行中,哪些引用将导致等待直到任务完成。


根据我自己的测试,在您开始阅读内容流之前,内容不会被传输,并且您的调用是正确的Task.Result是一个阻塞调用,但它的本质是一个同步点。But,它不会阻塞预缓冲整个内容,它只会阻塞直到内容starts来自服务器。

因此,无限流不会无限长时间地阻塞。因此,尝试异步获取流可能被认为是矫枉过正,特别是当您的标头处理操作相对较短时。但如果您愿意,您始终可以在另一个任务处理内容流时处理标头。像这样的事情就可以实现这一点。

static void Main(string[] args)
{
    var url = "http://somesite.com/bigdownloadfile.zip";
    var client = new HttpClient();
    var request = new HttpRequestMessage(HttpMethod.Get, url);

    var getTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
    Task contentDownloadTask = null;

    var continuation = getTask.ContinueWith((t) =>
    {
        contentDownloadTask = Task.Run(() =>
        {
            var resultStream = t.Result.Content.ReadAsStreamAsync().Result;
            resultStream.CopyTo(File.Create("output.dat"));
        });

        Console.WriteLine("Got {0} headers", t.Result.Headers.Count());
        Console.WriteLine("Blocking after fetching headers, press any key to continue...");
        Console.ReadKey(true);
    });

    continuation.Wait();
    contentDownloadTask.Wait();
    Console.WriteLine("Finished downloading {0} bytes", new FileInfo("output.dat").Length);

    Console.WriteLine("Finished, press any key to exit");
    Console.ReadKey(true);
}

请注意,无需检查标头部分是否完整,您已使用HttpCompletionOption.ResponseHeadersRead选项。这SendAsync在检索到标头之前,任务不会继续。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在内容 100% 完成之前从 HttpResponseMessage 读取标头 的相关文章

  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 找出 Google Cloud SDK 的安装位置

    我需要在以下位置添加 Google Cloud SDKPATH 所以我需要安装位置的路径 有没有gcloud 哪个命令给我这个信息 如果不是 我必须通过符号链接which gcloud etc 对于这个问题有更清洁的解决方案吗 以下命令将为
  • 有没有办法在html中自动播放音频?

    我想在打开网站时立即在网站中自动播放音频 但这不起作用
  • Python:排序的文件列表

    我使用 os path 从目录生成文件列表 我正在通过 Tkinter 从中生成一个照片库 然而排序是完全随机的 我没有看到目录中显示的照片顺序背后有更大的逻辑 当我打印列表时 它也是随机的 如何更改列表的顺序 按文件名或修改日期从该片段中
  • 具有 Runnable 类的 java 命令模式示例:接收器是否丢失?

    From Java 核心库中 GoF 设计模式的示例 https stackoverflow com questions 1673841 examples of gof design patterns in javas core libra
  • 增加 proxy_send_timeout 和 proxy_read_timeout ingress nginx

    我在 GKE 上运行部署 using quay io kubernetes ingress controller nginx ingress controller 0 12 0图像作为 nginx ingress controller 我正
  • Rscript 使用 renv 环境

    如何使用执行命令RScript myfile R这样它就使用它所在的项目 目录的 renv 环境 而不是我的默认环境 有几种方法 确保您的工作目录设置为您的根目录renv项目 并且 renv 项目的自动加载器处于活动状态 您可以通过调用来设
  • setprop libc.debug.malloc = 1 不起作用

    我尝试使用 setprop libc debug malloc 1 来找出泄漏 我制作了一个演示程序并在其中引入了内存泄漏 但上述标志无法检测到此泄漏 我尝试了以下命令 adb shell setprop libc debug malloc
  • 初始化 CUDA 中的设备数组

    如何初始化使用分配的设备数组cudaMalloc I tried cudaMemset 但它无法初始化除0 code 对于 cudaMemset 如下所示 其中值初始化为 5 cudaMemset devPtr value number b
  • 在方法之间传递变量?

    所以我想为大学编写一个简单的java程序 而我在java方面完全是新手 编译时 我在 printreciept 方法中不断收到错误 错误 找不到符号 我知道这就像无法访问 main 中的变量一样 有人可以帮忙吗 我知道如果我修复它 我可能会
  • 使用嵌入式谷歌表单绕过 CORS

    我正在尝试通过嵌入式表单将表单数据发送到谷歌 我找到了这个post https stackoverflow com questions 40560853 how to use google forms without iframe这似乎回答
  • 使用 PHP 中的 LAME 将 WAV 转换为 MP3

    我有 WAV 数据 想使用 PHP 脚本将其即时转换为 MP3 WAV 文件源自脚本 因此它最初并不是一个文件 我可以运行这样的东西 exec lame cbr b 32k in wav out mp3 但这需要我首先将 in wav 写入
  • 检查事件是否已存在

    我有一个数据网格加载行事件 gridObj LoadingRow new EventHandler
  • Symfony3 JWT 与 LexikJWTAuthenticationBundle 在预检选项上返回 404

    描述 我正在与LexikJWTAuthenticationBundle https github com lexik LexikJWTAuthenticationBundle并尝试使用从我的 Ionic2 应用程序发送的凭据生成 JWT 令
  • 实体框架一对多 TPH 映射

    我使用与此类似的数据结构 其中动物类型是根据表中的鉴别器列确定的 public class Farm public int Id get set public virtual ICollection
  • 在Excel中提取括号之间的数字?

    我一直在寻找这个问题的答案 但没有找到任何可以开始工作的东西 很可能是我对 Excel 的 小程 方面缺乏了解 无论如何 这就是我的情况 在 C2 C17 中 我设置了一些如下文本 2 工作名称 2 表示我们预计作业需要的小时数 其余部分是
  • 将全局 $stdout 重新分配给控制台 - ruby

    我试图将 stdout 设置为临时写入文件 然后再写入文件 test rb old stdout stdout stdout reopen mytestfile out w puts this goes in mytestfile stdo
  • 在 Doctrine2 的本机查询中获取未映射的字段

    我在 Symfony 3 和 Doctrine2 中有一个函数 它使用纬度和经度搜索最近的伙伴 public function findNearestPartner lat lng rsm new ResultSetMappingBuild
  • Web Api 2 API 无法识别路由的多个属性(版本控制)

    我正在尝试同时实现属性路由 http www asp net web api overview web api routing and actions attribute routing in web api 2和VersionedRout
  • 无需安装.net4.5即可运行webapi

    我有一个在asp net4 0下运行aspx页面的网站 我还有一些 DevExpress 控件 是我 4 年前购买的 我现在想向 Web 应用程序添加一个 API 但我知道这需要 net4 5 才能运行 DevExpress 控件在 4 5
  • 在内容 100% 完成之前从 HttpResponseMessage 读取标头

    在整个响应被传回之前 如何访问响应标头 当流到达时如何读取它 HttpClient 是接收 http 响应的精细控制的最佳选择吗 这是一个可以说明我的问题的片段 using var response await httpClient Sen