I'm getting the website form by htmlagilitypack, setting the form variable and trying to submit the form. Everything looks that is working fine, but the response from the form submit is 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);
    }
Does anyone know why my variable response is null?
Thanks
HttpClient.PostAsync return a Task<HttpResponseMessage> so normally it would need to be awaited. As you are using it in main method you would have to get the result from the task
var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();
Or the simpler
var response = client.PostAsync(uri, formContent).Result;
In both cases response would be an instance of HttpResponseMessage. You can inspect that instance for HTTP status and the content of the response.
If using .net core you can even use an async Main method like
static async Task Main(string[] args) {
    //..code removed for brevity
    var response = await client.PostAsync(uri, formContent);
    var content = await response.Content.ReadAsStringAsync();
    //...
}
                        You are missing .Result in your PostAsync. Simply, change the line to:
var response = client.PostAsync(uri, formContent).Result;
.Result however, runs the tasks synchronously. It returns AggregateException if there is an exception making it slightly difficult to debug.
If you are using Visual Studio 2017 Update 15.3 or above and C# 7.1 however, there is support for  aysnc main now.
You can modify your code as follows:
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);
}
This will help you to await the async task. In case you get any exception, you would receive the actual exception rather than AggregateException.
It is important to note that C# 7.1 currently is currently not enabled by default. To enable the 7.1 features, you would need to change the language version setting for your project.
Refer this link for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With