C#でHttpClientを使用してフォームを送信する

c# html-agility-pack httpclient httpresponse

質問

フォームの変数を設定し、フォームを送信しようとすると、htmlagilitypackでWebフォームを取得しています。すべて正常に動作しているようですが、フォームからの応答はnullです。

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

    }

誰も私の変数応答がnullである理由を知っていますか?

ありがとう

受け入れられた回答

HttpClient.PostAsyncTask<HttpResponseMessage>返すので、通常はそれを待たなければなりません。メインメソッドで使用しているので、タスクの結果を取得する必要があります

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

またはより単純な

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

いずれの場合も、応答はHttpResponseMessageインスタンスになります。 HTTPステータスとレスポンスの内容について、そのインスタンスを調べることができます。

.netコアを使用している場合は、次のような非同期Mainメソッドを使用することもできます。

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

人気のある回答

あなたは行方不明です。あなたのPostAsync Result 。単純に、行を次のように変更します。

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

ただし、 .Resultは同期して実行されます。例外があるとAggregateException返し、デバッグするのがやや難しくなります。

あなたが2017年の更新15.3以上、C#7.1がVisual Studioを使用している場合は、のためのサポートがありaysnc mainになりました。

次のようにコードを変更することができます:

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

これは、 asyncタスクをawaitのに役立ちます。例外が発生した場合は、 AggregateExceptionではなく実際の例外を受け取ります。

現在、C#7.1は現在デフォルトでは有効になっていないことに注意することが重要です。 7.1機能を有効にするには、プロジェクトの言語バージョン設定を変更する必要があります。

詳細については、このリンクを参照してください。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ