Ich erhalte das Website-Formular von htmlagilitypack, setze die Formularvariable und versuche das Formular abzuschicken. Alles sieht gut aus, aber die Antwort vom Formular submit ist 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);
}
Weiß jemand, warum meine variable Antwort null ist?
Vielen Dank
HttpClient.PostAsync
eine Task<HttpResponseMessage>
so dass normalerweise Task<HttpResponseMessage>
werden muss. Wie Sie es in der Hauptmethode verwenden, müssten Sie das Ergebnis von der Aufgabe erhalten
var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();
Oder das einfachere
var response = client.PostAsync(uri, formContent).Result;
In beiden Fällen wäre die Antwort eine Instanz von HttpResponseMessage
. Sie können diese Instanz auf den HTTP-Status und den Inhalt der Antwort prüfen.
Wenn Sie .net core verwenden, können Sie sogar eine asynchrone Main-Methode verwenden
static async Task Main(string[] args) {
//..code removed for brevity
var response = await client.PostAsync(uri, formContent);
var content = await response.Content.ReadAsStringAsync();
//...
}
Du fehlst . Result
in Ihrem PostAsync
. Ändern Sie einfach die Zeile zu:
var response = client.PostAsync(uri, formContent).Result;
.Result
führt die Aufgaben jedoch synchron aus. Es gibt eine AggregateException
wenn eine Ausnahme vorliegt, die das Debuggen etwas erschwert.
Wenn Sie Visual Studio 2017 Update 15.3 oder höher und C # 7.1 jedoch verwenden, gibt es jetzt Unterstützung für aysnc
main
.
Sie können Ihren Code wie folgt ändern:
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);
}
Dies wird Ihnen helfen, die async
Aufgabe await
. Für den Fall, dass Sie eine Ausnahme erhalten, erhalten Sie die eigentliche Ausnahme statt AggregateException
.
Es ist wichtig zu beachten, dass C # 7.1 momentan nicht standardmäßig aktiviert ist. Um die 7.1-Funktionen zu aktivieren, müssten Sie die Sprachversionseinstellung für Ihr Projekt ändern.
Weitere Informationen finden Sie unter diesem Link .