Извлечь информацию из ответа сервера C#
Я посылаю запрос на сервер средствами C#, получаю ответ:
HTTP/1.1 200 OK
Server: nginx/0.5.30
Date: Fri, 07 Aug 2009 14:45:04 GMT
Content-Type: text/html; charset=windows-1251
Transfer-Encoding: chunked
Connection: close
Set-Cookie: бла-бла-бла
Set-Cookie: бла-бла-бла
Set-Cookie: бла-бла-бла
Content-Encoding: gzip
<html><head><meta http-equiv="REFRESH" content="0; url=какой-нить"></head></html>
Вот как мне извлечь из ответа url?
Заранее спасибо (:
Вот мне из ответа и нужно выцепить url.php?0.5345235, просто авторизация у меня идет при событии кнопки и в конце события:
webBrowser1.Navigate("http://site.com/url.php?" + rnd.NextDouble());
rnd формируется:
Random rnd = new Random();
но так не идет, то что я свои случайные числа приписываю к url.php? не подходит, надо именно те, какие присылает сервер
int index = s.IndexOf("url=") + 4;
string beginUrl = s.Substring(index);
int index2 = beginUrl.IndexOf("\"");
string url = beginUrl.Substring(0, index2);
ну эту то строку я смогу присвоить, но после url.php? цифры после каждого запроса разные и мне их после каждой авторизации надо получать(или получать все что после url=), чтоб дальше на этом сайте работать.
url=url.php? - Это фиксировано, а вот цифры после "?" каждый раз разные :(
на строку:
В итоге в переменной url будут только цифры.
Мне не понятна эта строка:
при извлечении:
string beginUrl = s.Substring(index);
int index2 = beginUrl.IndexOf("\"");
string url = beginUrl.Substring(0, index2)
;
будут же постоянно одни и те же цифры, какие в строке, присвоенные переменной "s". А при каждой моей авторизации, эти цифры после .php? будут меняться и заранее я не знаю какие они будут.
<html><head><meta http-equiv="REFRESH" content="0; url=url.php?0.256620440646"></head></html>
Мне надо как-то либо только цифры получать из каждого запроса или все, что после url=
то есть так?
HttpWebResponse my1HttpWebResponse = (HttpWebResponse)my1HttpWebRequest.GetResponse();
и потом извлекать цифры из объекта my1HttpWebResponse?
rnd = my1HttpWebResponse.ToString();
int index = rnd.IndexOf("php?") + 4;
string beginUrl = rnd.Substring(index);
int index2 = beginUrl.IndexOf("\"");
string url = beginUrl.Substring(0, index2);
В последней строчке выбило ошибку:
Имя параметра: length
в переменной rnd будет текст System.Net.HttpWebResponse.
В rnd нужно занести именно ответ сервера, т. е. вот это:
Server: nginx/0.5.30
Date: Fri, 07 Aug 2009 14:45:04 GMT
Content-Type: text/html; charset=windows-1251
Transfer-Encoding: chunked
Connection: close
Set-Cookie: бла-бла-бла
Set-Cookie: бла-бла-бла
Set-Cookie: бла-бла-бла
Content-Encoding: gzip
<html><head><meta http-equiv="REFRESH" content="0; url=какой-нить"></head></html>
;)
А как это сделать, не подскажешь? (:
HttpWebRequest my1HttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://some-url.ru/login.php");
my1HttpWebRequest.Method = "POST";
my1HttpWebRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*";
my1HttpWebRequest.Referer = "http://some-url.ru/";
my1HttpWebRequest.Headers.Add("Accept-Language", "ru");
my1HttpWebRequest.ContentType = "application/x-www-form-urlencoded";
my1HttpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
my1HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; AutoCombats; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MAXTHON 2.0";
my1HttpWebRequest.Headers.Add("Cookie", "nf=" + sLogin + ";" + "nfid=" + Math.Floor(ts.TotalSeconds).ToString());
// передаем параметры
string sQueryString = "7cda50893a8ed5c0cfbbf722d72b89b2=1&login=" + sLogin + "&pwd=" + sPassword;
byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
my1HttpWebRequest.ContentLength = ByteArr.Length;
my1HttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
// делаем запрос
HttpWebResponse my1HttpWebResponse = (HttpWebResponse)my1HttpWebRequest.GetResponse();
Очевидно, нужный текст содержится в одном из свойств класса HttpWebResponse.
Т. е. my1HttpWebResponse.Method, my1HttpWebResponse.ProtocolVersion и пр. Нужно лишь перебрать их все. :)
"‹\b\0\0\0\0\0\0;ыфХ»ћѕъфцќВы§ћ>yрцнп§\nJOбАЈOп>јxюаЫ‹я\nПјярфзУ·фОї{ябЭГП/?=U°ITИ(JMіUКМKI*Р+И(°742±ґ40445PІ{\01аЭЈ\aџю|ьoЈџh§рс-ђ§\a\0RЇcy\0\0\0"
не могу понять почему, с кодировкой вроде все нормально :(
Очевидно, нужный текст содержится в одном из свойств класса HttpWebResponse.
Т. е. my1HttpWebResponse.Method, my1HttpWebResponse.ProtocolVersion и пр. Нужно лишь перебрать их все. :)
Вроде как вот это :)
StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(),enc);
string Response = loResponseStream.ReadToEnd();
но результат сами видите :(
"‹\b\0\0\0\0\0\0;ыфХ»ћѕъфцќВы§ћ>yрцнп§\nJOбА ЈOп>јxюаЫ‹я\nПјярфзУ·фОї{ябЭГП/?=U°ITИ(JMіUКМKI*Р+И(°742±ґ40445PІ{\01аЭЈ\aџю|ьoЈџ h§рс-ђ§\a\0RЇcy\0\0\0"
Content-Encoding: gzip
здесь не при чем?
Возник еще один вопросик, как мне передать куки, вместе с переходом на другую страницу?
"+url" добавляются те самые цифры
webBrowser1.Navigate("http://some-url/url.php?" + url);
Что вы понимаете под сессией? Идентификатор php-сессии?
Или вопрос в том, как получить или установить cookie в WebBrowser?
Тогда посмотрите в этом направлении:
И вообще наверное стоит почитать msdn.
Не очень компетентен в этом вопросе, но мне казалось, что WebBrowser сам должен заботиться об отсылке куков. Попробуйте зайти с помощью него на этот форум и залогиниться, если логин пройдет успешно, значит он сам их отправляет и принимает.
Опишите полностью схему Вашего взаимодействия с сервером, а то мы кажется не понимаем друг друга.
P.S. а не получается добавить свои куки к WebBrowser'у?
//Прохожу авторизацию
HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://some-site.ru/login.php");
myHttpWebRequest.Method = "POST";
myHttpWebRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*";
myHttpWebRequest.Referer = "http://some-site.ru/";
myHttpWebRequest.Headers.Add("Accept-Language", "ru");
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; AutoCombats; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MAXTHON 2.0";
// передаем параметры
string sQueryString = "45d5d7c9ef401144c0608d3159fd5ee1=1&login=" + sLogin + "&pwd=" + sPassword;
byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
myHttpWebRequest.ContentLength = ByteArr.Length;
myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
// делаем запрос
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Далее сохраняю ответ и вытаскиваю нужную инфу из ответа сервера:
int index = myStreamReader.IndexOf("url=") + 4;
string beginUrl = myStreamReader.Substring(index);
int index2 = beginUrl.IndexOf("\"");
url = beginUrl.Substring(0, index2);
Получаю куки:
if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]))
{
sCookies = myHttpWebResponse.Headers["Set-Cookie"];
}
и далее переход на страницу:
Собственно вот. Как мне отправить куки вместе с переходом на страницу?