.NET HttpClient 在多次请求后挂起(除非 Fiddler 处于活动状态)

Posted

技术标签:

【中文标题】.NET HttpClient 在多次请求后挂起(除非 Fiddler 处于活动状态)【英文标题】:.NET HttpClient hangs after several requests (unless Fiddler is active) 【发布时间】:2012-12-30 22:55:10 【问题描述】:

我正在使用System.Net.Http.HttpClient 将来自控制台应用程序的一系列请求发布到 REST API,并将 JSON 响应反序列化为强类型对象。我的实现是这样的:

using (var client = new HttpClient())

    var content = new StringContent(data, Encoding.UTF8, "text/html");
    var response = client.PostAsync(url, content).Result;

    response.EnsureSuccessStatusCode();

    return response.Content.ReadAsAsync<MyClass>().Result;

但是,我遇到了一个与this question 中描述的问题非常相似的问题,当请求通过 Fiddler 路由时一切正常,但是当 Fiddler 被禁用时,它在第 4 个或第 5 个请求之后挂起。

如果问题的原因是相同的,我认为我需要对 HttpClient 做更多的事情以使其在每次请求后完全释放其资源,但我无法找到任何代码示例来说明如何做这个。

希望有人能指出我正确的方向。

非常感谢,

提姆

【问题讨论】:

【参考方案1】:

您没有处理 HttpResponseMessage 对象。这可以将打开的流留给服务器,并且在单个服务器的一些流配额被填充后,将不再发送请求。

using (var client = new HttpClient())

    var content = new StringContent(data, Encoding.UTF8, "text/html");
    using(var response = client.PostAsync(url, content).Result)
        
        response.EnsureSuccessStatusCode();
        return response.Content.ReadAsAsync<MyClass>().Result;
    

【讨论】:

谢谢你,安德鲁 - 这是一个救生员。事实上,我之前在使用 HttpWebRequest 时已经看到过这个问题,并且解决方案是相同的,但是如何使用 HttpClient 代码模式来做到这一点并不是很明显。再次感谢。 这里发生了其他事情。这里唯一的流是 NetworkStream,它被传递到分配给响应消息的 Content 属性的 StreamContent 对象中。当像这样使用 HttpClient 时,响应体会自动缓冲,任何不可搜索的流在缓冲时将自动释放。无需处理 HttpClient 使用 HttpCompletionOption.ResponseContentRead 检索到的 HttpResponseMessage。

以上是关于.NET HttpClient 在多次请求后挂起(除非 Fiddler 处于活动状态)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 应用程序在调用后挂起

.NET Core Windows 服务中的并行任务在几秒钟后挂起

node.js http.get 在向远程站点发出 5 次请求后挂起

出站请求在一段时间后挂在ASP.NET Core 3.0应用程序中

MFC 应用程序在 CSingleLock Lock() 后挂起

cURL PHP 在收到标头后挂起