为了账号安全,请及时绑定邮箱和手机立即绑定

带有 .Net Core 2.1 的 HttpClient 挂起

带有 .Net Core 2.1 的 HttpClient 挂起

C#
收到一只叮咚 2021-07-21 21:54:27
鉴于以下 .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 resultWebRequest        -> Same result想法?更新 1 这在不在公司网络上时有效,这可能意味着代理的行为可能会发生变化。但是,无论如何,core2.0 仍然可以工作,因此试图找到差异。更新 2 似乎引入了一个错误,据报道...https://github.com/dotnet/corefx/issues/30166#issuecomment-395489603
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

因此,显然有一个关于此的错误/重大更改。


这里: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


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


查看完整回答
反对 回复 2021-07-31
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这是 CoreFx 2.1 中的一个更改,导致HttpClient使用新的HttpClientHandler. 这可能是您的问题的原因以及降级工作的原因。

您可以通过使用 WinHttpHandler 作为参数实例化 HttpClient、将环境变量设置DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER为 false 或通过在代码中调用以下内容来使用旧的 HttpHandler :

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


查看完整回答
反对 回复 2021-07-31
?
慕慕森

TA贡献1856条经验 获得超17个赞

这是一个著名的“21 秒”超时问题......在 Azure 中,对于很少调用的服务(我的服务正在从 Azure 基础结构调用外部服务)有帮助的是添加:

httpClient.DefaultRequestHeaders.ConnectionClose = true;


查看完整回答
反对 回复 2021-07-31
  • 3 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信