【问题标题】:Why do HttpClient.PostAsync and PutAsync dispose the content?为什么 HttpClient.PostAsync 和 PutAsync 处理内容?
【发布时间】:2014-08-25 22:37:58
【问题描述】:

HttpClient.PostAsync 方法的行为是处置提供的HttpContent 对象。

有很多方法可以解决此问题,包括为客户端上的每个调用构造一个新的HttpContent,或者将内容加载到流中并更改指针。

我想知道为什么调用此方法会自动调用其IDisposable 参数的处置?据我所知,这在 .NET 中并不常见

同样值得注意的是,在PUT请求中也观察到了这种行为,它们是幂等的,所以这种行为是为了防止信息再次发送的前提似乎并不正确。

【问题讨论】:

    标签: .net idisposable dotnet-httpclient dispose


    【解决方案1】:

    我无法立即在 referencesource 上找到实现,但 WCF 源也包含它。您正在寻找的方法是 DisposeRequestContent(HttpRequestMessage) 并且随附的评论是这样的:

    当请求完成时,HttpClient 会处理请求内容,这样用户就不必这样做了。 这也确保了HttpContent 对象只能使用HttpClient 发送一次(类似于HttpRequestMessages,也可以只发送一次)。

    HttpContent content = request.Content;
    if (content != null)
    {
        content.Dispose();
    }
    

    基本上,这是一种保障措施,可确保您不会两次发送相同的响应,他们认为这是一个糟糕/不常见/不鼓励的用例。

    【讨论】:

    • 我可以也许理解POST调用的这种行为,但是对于幂等的PUT请求也观察到了同样的行为;所以关于只发送一次的解释对我来说没有意义。
    • @Matthew 如果您在 HttpContent 上调用 LoadIntoBufferAsync,也没有意义进行处理。当我创建派生的 HttpContent 类时,我通常会确保 Dispose 方法不执行任何破坏性操作,以便我可以安全地重用内容。 Dispose 最初只应该用于清理非托管资源。我真的不喜欢它现在被用于任意清理的事实。
    • 这是我能找到的关于这个“便利”功能的唯一文档,虽然我看不到这样做有多方便,而且据我所知,我什至没有正式记录任何地方的行为:@ 987654322@
    • P.S.你能说我在这上面浪费了 4 个小时吗?
    • 我刚刚在对多目标项目进行单元测试时遇到了这种行为。有趣的是,当测试针对 NetCore 运行时,我没有得到对象处理异常。我猜他们修好了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多