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

Mat*_*hew 5 .net dispose idisposable dotnet-httpclient

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

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

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

还值得注意的是,这种行为也在PUT请求中被观察到,这是幂等的,因此这种行为是为了防止再次发送信息的前提似乎不正确.

Jer*_*vel 7

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

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

HttpContent content = request.Content;
if (content != null)
{
    content.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Matthew如果在HttpContent上调用LoadIntoBufferAsync,则处置也没有意义.当我创建派生的HttpContent类时,我经常会确保Dispose方法没有任何破坏性,这样我就可以安全地重用内容.最初的处理只应该用于清理非托管资源.我真的不喜欢它现在用于任意清理的事实. (7认同)