Requête HTTP n'échoue pas comme elle le devrait

Résolu/Fermé
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 - Modifié le 25 févr. 2022 à 20:32
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 - 27 févr. 2022 à 10:59
Bonjour,

Concernant un projet perso que j'ai décidé de re-écrire en C#, j'ai besoin de faire une requête http pour déterminer si mon serveur est actif ou non.

Voilà le code que j'essaie d'utiliser :

// See https://aka.ms/new-console-template for more information

using System;
using System.Net;

namespace EasyVNC // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        static void Main(string[] args)
        {
            
            HttpClient cl = new HttpClient();

            bool connectivite = false;

            try
            {
                cl.GetAsync("https://ngdong.murky-lane.top");
                connectivite = true;
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine(e.StatusCode);
            }

            if (connectivite)
            {
                Console.WriteLine("connectivité : OK");
            }
        }
    }
}


J'ai mis une url incomplète pour que la requête échoue, le problème est que la requête réussit à chaque fois.

Merci d'avance pour votre aide.




Configuration: Windows / Firefox 97.0


3 réponses

Utilisateur anonyme
26 févr. 2022 à 10:43
Bonjour

Je suis autodidacte et je n'ai jamais eu à coder d'appli liée au web. Donc cette classe là spécifiquement je ne la connais pas.
Cependant, le "mot clé" Async dans le nom de la méthode explique que tu n'aies pas d'erreur.

Tu es loin d'être un débutant en programmation, vu ton niveau en Batch (perso j'y pipe rien en bacth ;) ), mais je ne sais pas si tu es familier ou non du multithread. Donc je vais te brosser un portrait général.
Async ça veut asynchrone, littéralement qui ne se passe pas dans le même temps.

Concrètement, une méthode Async ne fait ce que son nom (ou l'aide en ligne) décrit mais elle lance un thread qui le fait.
Le thread vit sa vie de son coté et la ligne a été exécutée avec succès puisque le thread est lancé.

Un intérêt du multithread est de ne pas figer "la page" de l'application pendant l'exécution d'une tache longue. Dans le cas d'une application en mode console, ça n'a pas vraiment d'intérêt du coup.
Pour beaucoup de classe, il existe la méthode Asynch et la méthode "normale", mais selon l'aide en ligne elle n'existe pas.

En plus, ce ne sont pas les thread de bases qui sont utilisés mais une fabrique de threads (puissant, mais pas simple à expliquer)

Par contre, il y a un exemple consistant à rendre le programme lui même "inclus" dans la fabrique de thread sur l'aide en ligne
https://docs.microsoft.com/fr-fr/dotnet/api/system.net.http.httpclient?view=netframework-4.8


Je l'ai modifié ainsi pour tester (et pas te raconter n'importe quoi)
        // HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
        static readonly HttpClient client = new HttpClient();

        public static async Task Main(string[] args)
        {
            // Call asynchronous network methods in a try/catch block to handle exceptions.
            try
            {
                Console.WriteLine("CCM"); 
                HttpResponseMessage response = await client.GetAsync("https://forums.commentcamarche.net/forum/");
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();


                Console.WriteLine(responseBody);

                Console.WriteLine("Lien incomplet");
                response = await client.GetAsync("https://ngdong.murky-lane.top");
                response.EnsureSuccessStatusCode();
                responseBody = await response.Content.ReadAsStringAsync();


                Console.WriteLine(responseBody);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("\nException Caught!");
                Console.WriteLine("Message :{0} ", e.Message);
            }

            Console.ReadKey();
        }


Si tu veux comprendre le pourquoi du comment, je te recommande cette série de 4 tutos
https://fdorin.developpez.com/tutoriels/csharp/threadpool/part1/
https://fdorin.developpez.com/tutoriels/csharp/threadpool/part2/
https://fdorin.developpez.com/tutoriels/csharp/threadpool/part3/
https://fdorin.developpez.com/tutoriels/csharp/threadpool/part4/


0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
27 févr. 2022 à 10:41
Merci pour ta solution que j'ai testé et qui fonctionne. Il faut que je creuse encore un peu pour maintenant ignorer les erreurs liées à la validation du certificat SSL/TLS, je pense avoir trouvé une piste du côté de la propriété ServerCertificateCustomValidationCallback de la classe HttpClientHandler :

https://docs.microsoft.com/fr-fr/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=net-6.0#system-net-http-httpclienthandler-servercertificatecustomvalidationcallback

Je n'ai malheureusement pas le temps de me pencher là dessus aujourd'hui, je regarderai ce soir ou demain au pire.

Merci beaucoup pour tes explications et ta solution, je te tiendrai au jus.
0
Utilisateur anonyme
27 févr. 2022 à 10:55



Comme je te l'ai dit le web c'est pas mon rayon ;)
Le fait est que j'ai su répondre parce que ton "problème" n'est pas lié au web mais "purement" à C#

0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
27 févr. 2022 à 10:59
Mdr, ok je passe en "résolu" alors.

Merci et bon dimanche.
0