Войдите и получите данные со страницы встроенной формы, используя C # - PullRequest
1 голос
/ 16 июля 2011

Я немного запутался в том, как это сделать, так как не очень разбираюсь в веб-вещах.Я использую консольное приложение в C #, чтобы попытаться получить значение из ссылки на страницу внутри защищенной паролем домашней страницы . Я использую следующие данные

Вот код, который я пытаюсь использовать:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("");
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
req.Method = "POST";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Language: en-us,en;q=0.5");
req.Headers.Add("Accept-Encoding: gzip,deflate");
req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
req.KeepAlive = true;
req.Headers.Add("Keep-Alive: 300");
req.Referer = "copy from url";

req.ContentType = "application/x-www-form-urlencoded";

String Username = copy from url;
String PassWord = copy from url;

StreamWriter sw = new StreamWriter(req.GetRequestStream());
sw.Write(string.Format("&loginname={0}&password={1}&btnSubmit=Log In&institutioncode=H4V9KLUT45AV&version=2", Username, PassWord));
sw.Close();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream());
string tmp = reader.ReadToEnd();

Однако, когда я проверяю данные, полученные с веб-страницы, на которой они отображаютсячто-то вроде этого:

'... Время вашего сеанса истекло из-за неактивности. Пожалуйста, выйдите из системы и перезапустите.
вернитесь на страницу входа>'

IЯ предполагаю, что это связано с некоторыми вещами VIEWSTATE в ASP.NET. Я также предполагаю, что у меня может быть проблема с получением данных по ссылке, которую я извлеку с домашней страницы, потому что кажется, что ссылка просто загружает данные в фреймвместо перезагрузки веб-страницы.

Кто-нибудь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Данные вашей формы неверны.После удаления & в начале у меня это сработало:

sw.Write(string.Format("loginname={0}&password={1}&btnSubmit=Log In&institutioncode=H4V9KLUT45AV&version=2", Username, PassWord));

Кроме того, как уже упоминалось в другом ответе, вам необходимо добавить возвращенный файл cookie ASPSESSIONIDSSRRDRST в дальнейших запросах к сайту.

0 голосов
/ 22 июля 2011

Хорошо ... веб-сайт использует файлы cookie, поэтому после входа в систему вам необходимо сначала получить файлы cookie, чтобы сделать еще один запрос веб-запроса:

CookieCollection cookiesResponse = new CookieCollection();

if (response != null)
{
    foreach (string cookie in response.Headers["Set-Cookie"].Split(';'))
    {
        string name = cookie.Split('=')[0];
        string value = cookie.Substring(name.Length + 1);
        cookiesResponse.Add(new Cookie(name.Trim(), value.Trim(), path, domain));
    }
}

В вашем примере файл cookie содержит: ASPSESSIONIDSSRRDRST =FEKODBMDBEIPCLLENCFLFBEA

Вы должны использовать эту CookieCollection для любого запроса к Интернету, в своем запросе вы можете установить куки:

request.CookieContainer = cookiesResponse;

И, наконец, вы можете проанализировать ответ.Вы можете использовать анализ html-тегов или синтаксический анализ простого текста.

Надеюсь, это полезно.

...