Я получаю форму сайта htmlagilitypack, устанавливая переменную формы и пытаюсь отправить форму. Все выглядит нормально, но ответ из формы submit равен 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.PostAsync
возвращает Task<HttpResponseMessage>
поэтому ее обычно нужно ждать. Поскольку вы используете его в основном методе, вам нужно будет получить результат из задачи
var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();
Или проще
var response = client.PostAsync(uri, formContent).Result;
В обоих случаях ответ будет экземпляром HttpResponseMessage
. Вы можете проверить этот экземпляр для статуса HTTP и содержимого ответа.
Если вы используете ядро .net, вы можете использовать метод async Main, например
static async Task Main(string[] args) {
//..code removed for brevity
var response = await client.PostAsync(uri, formContent);
var content = await response.Content.ReadAsStringAsync();
//...
}
Вам не хватает . Result
в вашем PostAsync
. Просто измените строку на:
var response = client.PostAsync(uri, formContent).Result;
.Result
однако, выполняет задачу синхронно. Он возвращает AggregateException
если есть исключение, затрудняющее его отладку.
Если вы используете Visual Studio 2017 Update 15.3 или выше и C # 7.1, то теперь есть поддержка для aysnc
main
.
Вы можете изменить свой код следующим образом:
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);
}
Это поможет вам await
async
задачу. Если вы получите какое-либо исключение, вы получите фактическое исключение, а не AggregateException
.
Важно отметить, что C # 7.1 в настоящее время по умолчанию не включен. Чтобы включить функции 7.1, вам нужно будет изменить настройку языковой версии для вашего проекта.
Для получения дополнительной информации см. Эту ссылку .