wake-up-neo.net

HttpClient mit .Net Core 2.1 bleibt hängen

Angesichts der folgenden .Net Core 2.1 Console App ...

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());
            }
        }
    }
}

Beim Aufruf von GetAsync kommt es zu einer Ausnahme mit der folgenden Meldung:

System.Net.Http.HttpRequestException: Ein Verbindungsversuch ist fehlgeschlagen, weil der verbundene Teilnehmer nach einiger Zeit nicht richtig reagiert hat, oder die hergestellte Verbindung ist fehlgeschlagen, weil der verbundene Host nicht reagiert hat ---> System.Net.Sockets.SocketException: A Der Verbindungsversuch ist fehlgeschlagen, weil der verbundene Teilnehmer nach einiger Zeit nicht richtig reagiert hat, oder die hergestellte Verbindung ist fehlgeschlagen, weil der verbundene Host nicht reagiert hat

Wechseln Sie jedoch zu .Net Core 2.0 und es funktioniert einwandfrei ...

[~ # ~] note [~ # ~]

Ich habe versucht mit:

HttpClientFactory -> Same result
WebRequest        -> Same result

Gedanken?

UPDATE 1 Dies funktioniert, wenn Sie sich nicht im Unternehmensnetzwerk befinden, was möglicherweise zu einer Änderung des Verhaltens beim Proxy führen kann. Core2.0 funktioniert jedoch immer noch, auch wenn versucht wird, den Unterschied zu finden.

UPDATE 2 Es scheint, als wäre ein Fehler aufgetreten und es wird berichtet ...

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

10
Jim

Anscheinend wurde ein Bug/Breaking Change gemeldet.

Hier: https://github.com/dotnet/corefx/issues/30166https://github.com/dotnet/corefx/issues/30191

Zwei getrennte, aber verwandte Probleme, von denen ich glaube, dass ich sie erlebe.

Ich fand jedoch, was scheint, eine Problemumgehung.

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;
            }
        }
    }
}

Der wichtigste Teil hier ist, WinHttpHandler zu verwenden und WindowsProxyUsePolicy auf WindowsProxyUsePolicy.UseWinInetProxy Zu setzen.

WinHttpHandler wird durch Hinzufügen des Nuget-Pakets System.Net.Http.WinHttpHandler gefunden

9
Jim

Dies war eine Änderung in CoreFx 2.1, die dazu führte, dass HttpClient ein neues HttpClientHandler verwendete. Dies ist möglicherweise die Ursache für Ihr Problem und warum ein Downgrade funktioniert.

Es gibt viele Möglichkeiten, den Handler zurückzusetzen. Weitere Informationen finden Sie im Änderungsprotokoll . Sie können den alten HttpHandler verwenden, indem Sie einen HttpClient mit einem WinHttpHandler als Parameter instanziieren, die Umgebungsvariable DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER Auf false setzen oder in Ihrem Code Folgendes aufrufen:

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

Dies ist ein bekanntes Zeitüberschreitungsproblem (21 Sekunden). In Azure kann Folgendes für Dienste mit seltenen Anrufen (mein Dienst ruft einen externen Dienst aus der Azure-Infrastruktur an) hinzugefügt werden:

httpClient.DefaultRequestHeaders.ConnectionClose = true;
0
Pavel Biryukov