为什么HttpClient.PostAsync和PutAsync会处理内容?

时间:2014-08-25 22:37:59

标签: .net idisposable dotnet-httpclient dispose

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

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

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

同样值得注意的是,这种行为也在PUT请求中被观察到,这些行为是幂等的,因此这种行为是为了防止信息再次被发送的前提并不是这样。似乎是对的。

1 个答案:

答案 0 :(得分:6)

我无法立即在referencesource上找到实现,但WCF源代码也包含它。您正在寻找的方法是DisposeRequestContent(HttpRequestMessage),随附的评论说明了这一点:

  

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

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

基本上,它是一种安全措施,可确保您不会发送两次相同的响应,而这些响应是他们认为不良/不常见/不鼓励的用例。