.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 处于活动状态)的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core Windows 服务中的并行任务在几秒钟后挂起
node.js http.get 在向远程站点发出 5 次请求后挂起
出站请求在一段时间后挂在ASP.NET Core 3.0应用程序中