调用 ReadAsStreamAsync 时何时或是否要 Dispose HttpResponseMessage?

2023-12-28

我正在使用System.Net.Http.HttpClient http://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.118).aspx进行一些客户端 HTTP 通信。我将所有 HTTP 集中在一处,从代码的其余部分中抽象出来。在一种情况下,我想将响应内容作为流读取,但流的使用者与 HTTP 通信发生的位置以及流打开的位置很好地隔离。在负责 HTTP 通信的地方,我处理了所有HttpClient stuff.

该单元测试将失败于Assert.IsTrue(stream.CanRead):

[TestMethod]
public async Task DebugStreamedContent()
{
    Stream stream = null; // in real life the consumer of the stream is far away 
    var client = new HttpClient();        
    client.BaseAddress = new Uri("https://www.google.com/", UriKind.Absolute);

    using (var request = new HttpRequestMessage(HttpMethod.Get, "/"))
    using (var response = await client.SendAsync(request))
    {
        response.EnsureSuccessStatusCode();
        //here I would return the stream to the caller
        stream = await response.Content.ReadAsStreamAsync();
    }

    Assert.IsTrue(stream.CanRead); // FAIL if response is disposed so is the stream
}

我通常会尝试处理任何东西IDisposable尽早方便,但在这种情况下,处置HttpResponseMessage还处置Stream从返回ReadAsStreamAsync.

因此,调用代码似乎需要了解并获取响应消息以及流的所有权,或者我将响应消息保留为未处理状态,并让终结器处理它。这两种选择都感觉不对。

这个答案 https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed谈论不处置HttpClient。怎么样HttpRequestMessage and/or HttpResponseMessage?

我错过了什么吗?我希望让使用代码不了解 HTTP,但是留下所有这些未处理的对象违背了多年来的习惯!


所以看来调用代码需要了解并采取 响应消息和流的所有权,否则我离开 响应消息未处理并让终结器处理它。 这两种选择都感觉不对。

在这个具体案例中,没有终结器。两者都不HttpResponseMessage or HttpRequestMessage实现一个终结器(这是一件好事!)。如果您不处理它们中的任何一个,一旦 GC 启动,它们就会被垃圾收集,并且一旦发生这种情况,它们的底层流的句柄将被收集。

只要您还在使用这些物品,就不要丢弃。一旦完成,处理掉它们。而不是将它们包裹在using语句,您始终可以显式调用Dispose一旦你完成了。无论哪种方式,使用代码都不需要了解任何 http 请求的相关知识。

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

调用 ReadAsStreamAsync 时何时或是否要 Dispose HttpResponseMessage? 的相关文章

随机推荐

  • T 树或 B 树

    T树算法描述于这张纸 http www vldb org conf 1986 P294 PDFT Tree是T tree的改进 可以更好地使用查询操作 包括范围查询 并且包含T tree的所有其他良好功能 该算法在论文 T tree A M
  • 使用 fields_for 时如何将范围应用于关联?

    我有一个包含许多任务的项目 每个任务都属于一个人 在我的项目编辑表单中 我允许编辑现有任务并使用嵌套对象表单工具添加新任务 http ryandaigle com articles 2009 2 1 what s new in edge r
  • 如何在iOS上使用代码截屏?

    如何以编程方式截取屏幕截图 您可以使用UIGraphicsBeginImageContext以此目的 例如 UIGraphicsBeginImageContextWithOptions self view bounds size self
  • 制作第三代iPad应用程序的注意事项

    我目前正在制作一个 iPad 应用程序 其中的视图是为 iPad 2 分辨率创建的 不过现在iPad已经出了双倍分辨率了 我也得支持一下 请直接告知要在应用程序中进行哪些更改才能支持 iPad 2 和第 3 代 iPad 我能想到的唯一方法
  • 使用 C# 和 UI Automation 获取未知控件类型的内容

    下图中有一个区域 其具有未知 自定义 类别 那不是网格或表格 我需要能够 选择该区域中的行 从每个单元格中获取一个值 问题是因为这不是一个常见的类型元素 我不知道如何用谷歌搜索这个问题或自己解决它 到目前为止 代码如下 Process pr
  • 交换结构体数组中的元素

    假设我有这个结构 struct MyStruct int iID int iMyNumber 然后我定义一个 MyStructs 数组 struct MyStruct msTest 3 我正在通过查看 ID 对类似于此的结构进行排序操作 现
  • 在 Nuxt.js (SPA) 中使用“

    我使用 nuxt js express 启动该项目 我们为 nuxt js 中的每个组件 vue 开发了样式 因此 在路由时 属性会叠加在同一个类名 样式 上 从而导致页面无法正常显示 1 样式范围 的正确用法是什么 2 或者路由过程应该是
  • 如何在 Notepad++ 中模仿 Visual Studio 的 CTRL-X、CTRL-V 功能?

    I m using Notepad for some projects and miss Visual Studio s Ctrl X Ctrl C functionality that cuts or copies the entire
  • 从另一个表单显示一个表单

    当我想通过单击另一个表单中的按钮来显示表单 C 时 我通常从要显示的表单创建一个对象并使用 show 方法 Form2 f2 new Form2 f2 Show 或者我与 所有者 一起工作 Form2 tempForm new Form2
  • 如何使用 WhenCustomCommandReceived 设置 Topshelf?

    我正在使用 Topshelf 创建一个 Windows 服务 ServiceClass 并且我正在考虑使用 WhenCustomCommandReceived 发送自定义命令 HostFactory Run x gt x EnablePau
  • 在使用 reticulate 创建的 virtualenv 中安装特定版本的 python 包

    使用时reticulate为了在 R 中使用 Python 我们可以通过命令创建一个 virtualenvreticulate virtualenv create指定 env 名称和 python bin 的路径 我们还可以将包添加到之前创
  • 将日期发布到 Web API 的正确方法?

    我正在从 Web API 读取数据并填充表单 当我将其提交回 Web API 时 出现以下错误 Message 发生错误 ExceptionMessage 属性 类型 MvcApplication1 Models ProductSale 上
  • 使此 WCF 客户端代码在 Mac 上的 Mono 和 MonoTouch 上运行?

    我试图让以下代码在 Mono 控制台应用程序中工作 并作为 MonoTouch 应用程序的最终目标 该代码在使用 Windows 控制台应用程序的 VS2008 下运行良好 当在 Mac 上将其作为 Mono 控制台应用程序运行时 我得到
  • 为 CoffeeScript 声明不同的编译路径

    我有一个 Scalatra 应用程序可以编译 CoffeeScript 使用https github com softprops coffeescripted sbt https github com softprops coffeescr
  • Spring MVC 打开PDF作为视图

    哪个 View 类适合渲染现有 PDF 抽象视图 我通过网络服务获取 PDF 所以我不打算子类 Abstract PdfView 来渲染 PDF 我想继续使用返回 ModelAndView 的 Spring 控制器类 这意味着编写我自己的
  • 进程在读取时挂起

    以下代码通过管道从其他进程读取消息 所有进程都正确打印出所有消息 但它们将永远不会继续经过 while 循环 尝试在 Eclipse 中进行调试 在阅读完所有消息后 它将停止在 while 循环处 索引是分配给每个进程的编号 第一个进程的索
  • 如何使用 PHP 生成二维码?

    我正在尝试将一些数据转换为网页上的二维码 为此 我使用 php qrcode Sourceforge 图书馆主页 http phpqrcode sourceforge net http phpqrcode sourceforge net 我
  • 将图片插入Excel单元格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想生成一份带有图片的报告 但我无法将图片放入单个单元格中 我可以让图片 浮动 在我的工作表周围 但我需要将它们放入单元格中 我怎样才能做
  • getLocationOnScreen() 与 getLocationInWindow()

    在这两种方法的上下文中 屏幕和视图有什么区别 我有一个按钮 我想获取其中心的 x 坐标 我想这就足够了 public int getButtonXPosition return button getLeft button getRight
  • 调用 ReadAsStreamAsync 时何时或是否要 Dispose HttpResponseMessage?

    我正在使用System Net Http HttpClient http msdn microsoft com en us library system net http httpclient v vs 118 aspx进行一些客户端 HT