Зависает HttpClient с .Net Core 2.1 - PullRequest
0 голосов
/ 07 июня 2018

С учетом следующего консольного приложения .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: попытка подключения не удалась, потому чтоподключенная сторона не ответила должным образом через некоторое время или не удалось установить установленное соединение, поскольку подключенный хост не смог ответить

Однако переключитесь на .Net Core 2.0, и он работает нормально ...

ПРИМЕЧАНИЕ

Я пытался использовать:

HttpClientFactory -> Same result
WebRequest        -> Same result

Мысли?

ОБНОВЛЕНИЕ 1 Это работает, когда отсутствует в корпоративной сети, что может означать изменение поведения с прокси-сервером, возможно.Тем не менее, core2.0 по-прежнему работает независимо от того, поэтому пытается найти разницу.

ОБНОВЛЕНИЕ 2 Похоже, ошибка была введена и сообщается ...

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

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Итак, по-видимому, об этом сообщается об ошибке / критическом изменении.

Здесь: 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

0 голосов
/ 08 декабря 2018

Это известная проблема тайм-аута «21 секунда» ... Что помогает в Azure для службы с редкими вызовами (моя служба вызывает внешнюю службу из инфраструктуры Azure), добавляет:

httpClient.DefaultRequestHeaders.ConnectionClose = true;
0 голосов
/ 07 июня 2018

В CoreFx 2.1 произошло изменение, из-за которого HttpClient использует новый HttpClientHandler.Возможно, это является причиной вашей проблемы и причины, по которой работает понижение версии.

Существует множество способов сброса обработчика, и вы можете узнать больше об этом в журнале изменений .Вы можете использовать старый HttpHandler, создав экземпляр HttpClient с WinHttpHandler в качестве параметра, задав для переменной среды DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER значение false или вызвав в своем коде следующее:

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