带有.Net Core 2.1的HttpClient挂起

鉴于以下.Net Core 2.1控制台应用…

using System; using System.Diagnostics; using System.Net.Http; using System.Net.Http.Headers; namespace TestHttpClient { class Program { static void Main(string[] args) { try { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); string url = "https://jsonplaceholder.typicode.com/posts/1"; var response = httpClient.GetAsync(url).Result; string jsonResult = response.Content.ReadAsStringAsync().Result; } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } } } } 

对GetAsync的调用挂起抛出exception,并显示以下消息:

System.Net.Http.HttpRequestException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应—> System.Net.Sockets.SocketException:A连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应

但是,切换到.Net Core 2.0,它工作正常……

注意

我尝试过使用:

 HttpClientFactory -> Same result WebRequest -> Same result 

思考?

更新1当不在公司网络上时,这可能意味着可能意味着代理行为的变化。 然而,core2.0仍然可以工作,所以试图找到差异。

更新2看起来像一个错误被引入并报告…

https://github.com/dotnet/corefx/issues/30166#issuecomment-395489603

这是CoreFx 2.1的一个变化,导致HttpClient使用新的HttpClientHandler 。 这可能是您的问题的原因以及降级的原因。

有许多方法可以重置处理程序,您可以在更改日志中阅读有关它的更多信息。 您可以通过使用WinHttpHandler作为参数实例化HttpClient,将环境变量DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER设置为false,或者通过在代码中调用以下内容来使用旧的HttpHandler:

 AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false); 

显然,有一个错误/突破性的变化报告。

这里: https : //github.com/dotnet/corefx/issues/30166 https://github.com/dotnet/corefx/issues/30191

我认为是我遇到的两个独立但相关的问题。

但是,我发现似乎是一种解决方法。

 using System; using System.Diagnostics; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; namespace TestHttpClient { static class Program { static async Task Main(string[] args) { try { using (var httpClient = new HttpClient(new WinHttpHandler() { WindowsProxyUsePolicy = WindowsProxyUsePolicy.UseWinInetProxy })) { httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); string url = "https://jsonplaceholder.typicode.com/posts/1"; var response = await httpClient.GetAsync(url); string jsonResult = await response.Content.ReadAsStringAsync(); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); throw; } } } } 

这里的关键部分是使用WinHttpHandler并将WindowsProxyUsePolicy设置为WindowsProxyUsePolicy.UseWinInetProxy

通过添加nuget包System.Net.Http.WinHttpHandler找到WinHttpHandler