HttpWebRequest и HttpWebResponse

 
0
 
.NET
ava
nikitao | 16.12.2007, 21:04
Всем привет. Пытаюсь разобраться с классами из сабжа - что то не получается.

Вот смотрите.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://accounts.craigslist.org/");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string s = new StreamReader(response.GetResponseStream()).ReadToEnd();


И о ЧУДО в s у нас оказался HTML код нужной странички smile Но вот дальше не понятно. Нужно заполнить элементы на форме. Но КАК ? делаю так.


HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://accounts.craigslist.org/");
request.Method = "POST";
request.AllowAutoRedirect = false;
string sQueryString = "loginType=L&step=confirmation&originalURI=%2Flogin&rt=&rp=&inputEmailHandle=nikitao%40alltube.ru&inputPassword=NESKAZUUUU";
byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
request.ContentLength = ByteArr.Length;
request.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

По идее в Хедарах должны разные полезные вещи сохраняться. Куда там дальше идти. Но там все пусто. Тупняк короче. Жду помощи :)

Заранее спасибо.

ЗЫ На статью на gotdotnet прошу не слать smile
Comments (11)
ava
ishimcity | 17.12.2007, 09:28 #
Что у тебя за проблема?
ava
tol05 | 17.12.2007, 10:36 #
Цитата (nikitao @ 16.12.2007, 20:04 findReferencedText)
Нужно заполнить элементы на форме. Но КАК ?

я когда-то через Microsoft.mshtml это делал. Что-то наподобие такого:

InternetExplorer IE;
try
{
IE = new InternetExplorer();

IE.Visible = true;

object Dummy = Type.Missing;
IE.Visible = true;
IE.Navigate("https://...", ref Dummy, ref Dummy, ref Dummy, ref Dummy);
}
catch(Exception)
{
// ...
}
FBusy(IE);
try
{
Type IEType = Type.GetTypeFromProgID("InternetExplorer.Application");
Object IEX = Activator.CreateInstance(IEType);
IEType.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, IEX, new object[] { true });

HTMLInputElementClass log = ((HTMLDocument)IE.Document).all.item("tbLogin", 0) as TMLInputElementClass;
HTMLInputElementClass pas = ((HTMLDocument)IE.Document).all.item("tbPassword", 0) as HTMLInputElementClass;
log.value = "my_Login";
pas.value = "my_Password";

HTMLInputElementClass sub = ((HTMLDocument)IE.Document).all.item("btnSubmit", 0) as HTMLInputElementClass;
sub.click();
}
catch(Exception)
{
// ...
}
FBusy(IE);
IE.Quit();


//Не помню почему именно так. Не настаиваю на этом варианте :)
private static void FBusy(InternetExplorer IE)
{
while(IE.Busy)
{
Thread.Sleep(100);
}
ava
Stepan_Lameroff | 17.12.2007, 11:29 #
Посмотрите Login in to Password and HTTPS Protected Web Sites to Process HTML Forms with C#
Довольно удачный пример работы с HtmlAgilityPack
ava
nikitao | 17.12.2007, 20:59 #
tol05, привет , у меня сейчас все приложение и работает на WebBrowser + Microsoft.mshtml. Хочу отказатьсяот этой практики т к
1) не очень экономично по времени
2) Не экономично по памяти. У меня в 1 момент времени может грузиться до 1000 этих браузеров. И это все вылетает в большую капеечку в ОЗУ.


Stepan_Lameroff, спасибо , посмотрю.


ishimcity, В голобальном смысле вопрос звучит так. Как без использования WebBrowser и Microsoft.mshtml загрузить страничку , заполнить на ней формочки и отправить дальше.
ava
Experimenter | 18.12.2007, 14:24 #
nikitao,
Цитата


ЗЫ На статью на gotdotnet прошу не слать smile

а сюда отправить можно? Добавь строчку

request.ContentType = "application/x-www-form-urlencoded";
ava
nikitao | 22.12.2007, 14:17 #
Ага. Спасибо. Почитаю.
ava
nikitao | 28.12.2007, 19:28 #
вопрос остается открытым. Конкретный вопрос. почему не работает этот код :


HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://accounts.craigslist.org/login");
request.Method = "POST";
request.KeepAlive = true;
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.AllowAutoRedirect = false;
//request.Connection = "keep-alive";
request.Headers.Add("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
request.Headers.Add("Accept-Encoding", "gzip,deflate");
request.Headers.Add("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
request.Headers.Add("Keep-Alive", "300");
request.Referer = "https://accounts.craigslist.org/login";
request.Headers.Add("Cookie", "cl_def_hp=stpetersburg; cl_def_lang=en");
request.ContentType = "application/x-www-form-urlencoded";
byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes("&loginType=L&step=confirmation&originalURI=%2Flogin&rt=&rp=&inputEmailHandle=nikitao%40alltube.ru&inputPassword=password");
request.ContentLength = ByteArr.Length;
request.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(result);
Console.ReadLine();
ava
tol05 | 29.12.2007, 00:27 #
a почему не работает? Я сделал тестовый asp.net сайт с одной страницей
Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
</html>

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
foreach (string key in Request.Form.AllKeys)
{
Response.Write(key);
}

}
}

запустил твой код (url только поменял) и получил на консоль
Цитата


loginTypesteporiginalURIrtrpinputEmailHandleinputPassword



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html xmlns="http://www.w3.org/1999/xhtml">

<head><title>
  Untitled Page

</title></head>

<body>
  <form name="form1" method="post" action="Default.aspx" id="form1">

<div>

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTQ2OTkzNDMyMWRk1Fi1UDSOoEHuENdgb/mCOtC3ucM=" />

</div>


  <div>
  <input type="submit" name="Button1" value="Button" id="Button1" />
  </div>
 

<div>


  <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgK9ho7DDQKM54rGBiRV3VRMH0H2UF8kC51lN4ZGWxRa" />

</div></form>

</body>

</html>


зачит или разбирайся с Encoding твоего сайта, или с

"&loginType=L&step=confirmation&originalURI=%2Flogin&rt=&rp=&inputEmailHandle=nikitao%40alltube.ru&inputPassword=ge3moub"
ava
nikitao | 29.12.2007, 01:25 #
ну да. код то в целом в том направлении..... но мне бы понять почему именно с craigslist не работает....просто очень срочно надо.... :(
ava
mr.DUDA | 29.12.2007, 11:47 #
Может оно через SSL (https://) не хочет коннектиться? В описании HttpWebRequest мсдн про SSL ничего нет?
ava
nikitao | 30.12.2007, 02:52 #
проблема решилась. необходимо прописать :

request.ProtocolVersion = new Version(1, 0);


added later:
и хз почему с 1.1 не работает smile
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit