Invia modulo utilizzando HttpClient in C #

c# html-agility-pack httpclient httpresponse

Domanda

Sto ricevendo il modulo del sito Web da htmlagilitypack, impostando la variabile del modulo e cercando di inviare il modulo. Tutto sembra funzionante, ma la risposta dal modulo di invio è nullo.

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

    }

Qualcuno sa perché la mia risposta variabile è nullo?

Grazie

Risposta accettata

HttpClient.PostAsync restituisce un'attività Task<HttpResponseMessage> quindi normalmente dovrebbe essere attesa. Siccome lo stai usando nel metodo principale, dovresti ottenere il risultato dall'attività

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

O il più semplice

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

In entrambi i casi la risposta sarebbe un'istanza di HttpResponseMessage . È possibile ispezionare l'istanza per lo stato HTTP e il contenuto della risposta.

Se usi .net core puoi anche usare un metodo Main async come

static async Task Main(string[] args) {

    //..code removed for brevity

    var response = await client.PostAsync(uri, formContent);
    var content = await response.Content.ReadAsStringAsync();
    //...
}

Risposta popolare

Ti manca . Result nel tuo PostAsync . Semplicemente, cambia la linea in:

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

.Result Tuttavia, esegue le attività in modo sincrono. Restituisce AggregateException se c'è un'eccezione che rende leggermente difficile il debug.

Tuttavia, se si utilizza Visual Studio 2017 Update 15.3 o successivo e C # 7.1, ora è disponibile il supporto per aysnc main .

Puoi modificare il tuo codice come segue:

static async Task Main()
{
    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 = await client.PostAsync(uri, formContent);
}

Questo ti aiuterà ad await il compito async . Nel caso in cui si ottenga un'eccezione, si riceverà l'eccezione effettiva anziché AggregateException .

È importante notare che C # 7.1 al momento non è attualmente abilitato per impostazione predefinita. Per abilitare le funzionalità 7.1, è necessario modificare l'impostazione della versione della lingua per il progetto.

Fai riferimento a questo link per maggiori dettagli.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché