Для отправки формы программно, общая идея заключается в том, что вы хотите выдать себя за браузер.Для этого вам нужно найти правильную комбинацию URL, HTTP-заголовков и данных POST, чтобы удовлетворить сервер.
Самый простой способ выяснить, что нужно серверу, это использовать Fiddler, FireBug или другой инструмент, который позволяет вам точно узнать, что браузер отправляет по проводам.Затем вы можете экспериментировать в своем коде, добавляя или удаляя заголовки, изменяя данные POST и т. Д., Пока сервер не примет запрос.
Вот несколько ошибок, с которыми вы можете столкнуться:
- Сначала убедитесь, что вы отправляете форму по правильному целевому URL.Многие формы не публикуются сами по себе, но затем публикуются по другому URL-адресу
- , форма может проверять наличие файла cookie сеанса или файла cookie для аутентификации, то есть вам нужно сделать один запрос (чтобы получитьcookie), а затем сделайте следующий приготовленный запрос на отправку формы.
- форма может содержать скрытые поля, которые вы забыли заполнить. Используйте Fiddler или Firebug, чтобы просмотреть поля формы, отправленные при заполнении формы вручную в браузере, и обязательно включите те же поля в свойкод
- , в зависимости от реализации сервера, вам может потребоваться закодировать символ
@
как %40
Могут быть и другие проблемы, но приведенные выше наиболее вероятны,Чтобы увидеть полный список, взгляните на мой ответ на другой вопрос, касающийся экрана.
Кстати, код, который вы используете для отправки формы, намного сложнее и многословнее, чем необходимо.Вместо этого вы можете использовать WebClient.UploadValues()
и выполнить то же самое с меньшим количеством кода и с автоматическим кодированием для вас.Например:
NameValueCollection postData = new NameValueCollection();
postData.Add ("appid","001");
postData.Add ("email","chris@test.com");
postData.Add ("receipt","testing");
postData.Add ("machineid","219481142226.1");
postData.Add ("checkit","checkit");
WebClient wc = new WebClient();
byte[] results = wc.UploadValues (
"http://www.example.com/licensing/check.php",
postData);
label2.Text = Encoding.ASCII.GetString(results);
ОБНОВЛЕНИЕ:
Учитывая наше обсуждение в комментариях, проблема, с которой вы столкнулись, является одной изПричины, которые я первоначально отметил выше:
форма может проверять наличие файла cookie сеанса или файла cookie аутентификации, то есть вам нужно сделать один запрос (чтобы получить файл cookie), а затем сделать последующий файл cookie.запрос на отправку формы.
На сервере, который использует файлы cookie для отслеживания сеанса или проверки подлинности, если запрос отображается без подключенного файла cookie, сервер обычно перенаправляет на тот же URL-адрес.Перенаправление будет содержать заголовок Set-Cookie
, означающий, что при повторном запросе перенаправленного URL к нему будет прикреплен файл cookie, прикрепленный клиентом.Этот подход нарушается, если первый запрос является формой POST, потому что сервер и / или клиент не обрабатывают перенаправление POST.
Исправление, как я первоначально описал, - это сделать первоначальный GET-запрос на получение cookie-файла, а затем сделать POST как второй запрос, передавая cookie-файл обратно.
Вот так:
using System;
public class CookieAwareWebClient : System.Net.WebClient
{
private System.Net.CookieContainer Cookies = new System.Net.CookieContainer();
protected override System.Net.WebRequest GetWebRequest(Uri address)
{
System.Net.WebRequest request = base.GetWebRequest(address);
if (request is System.Net.HttpWebRequest)
{
var hwr = request as System.Net.HttpWebRequest;
hwr.CookieContainer = Cookies;
}
return request;
}
}
class Program
{
static void Main(string[] args)
{
var postData = new System.Collections.Specialized.NameValueCollection();
postData.Add("appid", "001");
postData.Add("email", "chris@test.com");
postData.Add("receipt", "testing");
postData.Add("machineid", "219481142226.1");
postData.Add("checkit","checkit");
var wc = new CookieAwareWebClient();
string url = "http://www.example.com/licensing/check.php";
// visit the page once to get the cookie attached to this session.
// PHP will redirect the request to ensure that the cookie is attached
wc.DownloadString(url);
// now that we have a valid session cookie, upload the form data
byte[] results = wc.UploadValues(url, postData);
string text = System.Text.Encoding.ASCII.GetString(results);
Console.WriteLine(text);
}
}