3 votes

Vérifiez le port ouvert avant de tenter la connexion HttpClient

Les différentes méthodes de la classe HttpClient (GetAsync etc.) prennent un objet Uri ou une chaîne de caractères et tentent d'ouvrir une connexion à l'emplacement spécifié. Cependant, il est très probable dans mon cas que l'hôte distant n'écoute pas (le port est fermé et sera activement refusé; il se trouve à l'intérieur de notre LAN).

Je préférerais ne pas compter sur la capture d'une exception pour gérer ce scénario, d'autant plus que ces méthodes lancent une AggregateException que je devrais alors trier.

Y a-t-il un meilleur moyen de détecter ce scénario tout en bénéficiant des avantages de la classe HttpClient (l'hôte distant est un service WebApi) ? Devrais-je vérifier si le port écoute préalablement en utilisant quelque chose comme TcpClient ? Bien sûr, cela implique une condition de concurrence entre les appels. J'espère que la surcharge de constructeur qui prend un HttpMessageHandler aidera, mais rien dans WebRequestHandler ne m'aide non plus...

3voto

PaRiMaL RaJ Points 9206

Vous pouvez utiliser le Socket.Connect(string host, int port)

    private static bool TestForOpenHttpPort(string host)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            s.Connect(host, 80);
            return true;
        }
        catch (SocketException)
        {
            return false;
        }
        finally
        {
            ((IDisposable)s).Dispose();
        }
    }

Utilisation simple :

if (TestForOpenHttpPort("google.com"))
{
    // Le socket est ouvert
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X