.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 处于活动状态)的主要内容,如果未能解决你的问题,请参考以下文章