Soumettre le formulaire en utilisant HttpClient en C #

c# html-agility-pack httpclient httpresponse

Question

Je reçois le formulaire de site Web par htmlagilitypack, en définissant la variable de formulaire et en essayant de le soumettre. Tout semble aller pour le mieux, mais la réponse du formulaire d'envoi est nulle.

static void Main(string[] args)
    {
        string urlAddress = "mywebsite";

        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(urlAddress);

        // Post link
        var post = doc.GetElementbyId("post").GetAttributeValue("href", "");

        doc = web.Load(post);

        // get the form
        var form = doc.DocumentNode.SelectSingleNode("//form[@class='picker']");

        // get the form URI
        string actionValue = form.Attributes["action"]?.Value;
        System.Uri uri = new System.Uri(actionValue);

        // Populate the form variable
        var formVariables = new List<KeyValuePair<string, string>>();
        formVariables.Add(new KeyValuePair<string, string>("id", "ho"));
        var formContent = new FormUrlEncodedContent(formVariables);

        // submit the form
        HttpClient client = new HttpClient();
        var response = client.PostAsync(uri, formContent);

    }

Est-ce que quelqu'un sait pourquoi ma réponse variable est nulle?

Merci

Réponse acceptée

HttpClient.PostAsync renvoie une Task<HttpResponseMessage> si normalement, elle doit être attendue. Comme vous l’utilisez dans la méthode principale, vous devez obtenir le résultat de la tâche.

var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();

Ou le plus simple

var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();

Dans les deux cas, la réponse serait une instance de HttpResponseMessage . Vous pouvez inspecter cette instance pour connaître l'état HTTP et le contenu de la réponse.

Si vous utilisez .net core, vous pouvez même utiliser une méthode principale asynchrone telle que

var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();

Réponse populaire

Tu es absent . Result dans votre PostAsync . Changez simplement la ligne pour:

var response = client.PostAsync(uri, formContent).Result;

.Result cependant, exécute les tâches de manière synchrone. Il renvoie AggregateException s'il existe une exception rendant le débogage un peu difficile.

Toutefois, si vous utilisez Visual Studio 2017 Update 15.3 ou une version aysnc et C # 7.1, aysnc main désormais pris en charge.

Vous pouvez modifier votre code comme suit:

var response = client.PostAsync(uri, formContent).Result;

Cela vous aidera à await la tâche async . Si vous obtenez une exception, vous recevrez l’exception réelle plutôt qu’une exception AggregateException .

Il est important de noter que C # 7.1 n'est actuellement pas activé par défaut pour le moment. Pour activer les fonctionnalités 7.1, vous devez modifier le paramètre de version linguistique de votre projet.

Reportez-vous à ce lien pour plus de détails.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi