11

鉴于以下 .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

4

3 回答 3

12

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

这里: 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并将其设置WindowsProxyUsePolicyWindowsProxyUsePolicy.UseWinInetProxy

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

于 2018-06-08T12:52:11.590 回答
12

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

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

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
于 2018-06-07T20:24:53.877 回答
2

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

httpClient.DefaultRequestHeaders.ConnectionClose = true;
于 2018-12-08T18:42:12.647 回答