猿问

带有 .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 的调用挂起并引发异常并显示以下消息:


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


收到一只叮咚
浏览 193回答 3
3回答

一只斗牛犬

因此,显然有一个关于此的错误/重大更改。这里: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.UseWinInetProxyWinHttpHandler通过添加 nuget 包System.Net.Http.WinHttpHandler 找到

杨__羊羊

这是 CoreFx 2.1 中的一个更改,导致HttpClient使用新的HttpClientHandler. 这可能是您的问题的原因以及降级工作的原因。您可以通过使用 WinHttpHandler 作为参数实例化 HttpClient、将环境变量设置DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER为 false 或通过在代码中调用以下内容来使用旧的 HttpHandler :AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

慕慕森

这是一个著名的“21 秒”超时问题......在 Azure 中,对于很少调用的服务(我的服务正在从 Azure 基础结构调用外部服务)有帮助的是添加:httpClient.DefaultRequestHeaders.ConnectionClose = true;
随时随地看视频慕课网APP
我要回答