Добрый день стоит такая задача. Программе передастся HTTP запрос. Например такой: PHP: GET http://www.google.com.ua/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: uk User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: www.google.com.ua Cookie: lolnoob Программа должна отправить этот запрос на необходимый сайт (http://www.google.com.ua) и получить от него ответ. Хочу сделать через HttpWebRequest но: WebReq.Accept WebReq.Connection WebReq.ContentLength WebReq.ContentType WebReq.Expect WebReq.KeepAlive WebReq.MediaType WebReq.Method WebReq.Pipelined WebReq.PreAuthenticate WebReq.ProtocolVersion WebReq.Referer и т.д Это все придется парсить Жду вашего совета p.s Запросы всегда меняются !
Вопрос изначально поставлен неправильно. На какую программу посылается HTTP запрос? HTTP запросы бывают разные, обычно POST/GET. Если ты делаешь клиент - серверную программу, сервер также может служить для обеих запросов, принимать и отсылать все ответы. А парсить будешь через регулярки или с методами стринга. Вот, например: // Подключаем спейсы using System.Text.RegularExpressions; using System.Net; // Создаем переменные private WebRequest Request; private WebResponse Response; private StreamReader Reader; // Переменная для кук private string Cook = ""; // Страница на которую отправляется запрос string SendPage = "http://www.google.com"; // Создаем запрос "POST" Request = WebRequest.Create(SendPage); Request.Method = "POST"; Request.ContentType = "application/x-www-form-urlencoded"; Request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8"); Request.Headers.Add("Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1"); Request.Headers.Add("Accept-Encoding", "deflate, gzip, x-gzip, identity, *;q=0"); ((HttpWebRequest)Request).UserAgent = "Не имеет значение, если не надо выводить в Браузер"; ((HttpWebRequest)Request).KeepAlive = true; ((HttpWebRequest)Request).Proxy = null; Ставим обязательно, это также ускоряет подключение. ((HttpWebRequest)Request).Referer = "http://www.google.com"; (HttpWebRequest)Request).Accept = "text/html"; // Проверяем, если имеются куки, берем обязательно if (!String.IsNullOrEmpty(Cook)) { Request.Headers.Add(HttpRequestHeader.Cookie, Cook); } // Здесь будут твои данные. Обычно все данные посылаются с Амперсандом указывающие на переменную присвоив значения с правой стороны. string Dataa = "&login=твой логин" "&pass=твой пароль" ; byte[] ByteArr = Encoding.GetEncoding(1251).GetBytes(Dataa); Request.ContentLength = ByteArr.Length; Request.GetRequestStream().Write(ByteArr, 0, ByteArr.Length); Response = Request.GetResponse(); Reader = new StreamReader(Response.GetResponseStream(), Encoding.GetEncoding("utf-8")); // Ставим true/false для перенаправления на другую страницу. Но нежелательно, т.к. могут потеряться куки, надо будет следить за каждым запросом ((HttpWebRequest)Request).AllowAutoRedirect = false; // Парсим страничку // Создаем переменную для страницы string S = Reader.ReadToEnd(); // Для IP адресов string RegPattern = @"^((2[0-5]{2}|1[0-9]{2}|[0-9]{1,2})\.){3}(2[0-5]{2}|1[0-9]{2}|[0-9]{1,2})$"; Match RegMatches = Regex.Match(S, RegPattern); if (RegMatches.Success) { MessageBox.Show(RegMatches.value); // Если значение разделилась на группы, вытаскиваем оттуда начиная с нуля. MessageBox.Show(RegMatches.Groups[0].value); } // Закрываем поток, освобождаем память Reader.Close(); Response.Close();
есть запрос (он часто меняется(меняется и GET на POST и меняется Хост)): PHP: GET http://www.google.com.ua/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: uk User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: www.google.com.ua Cookie: lolnoob мне надо отправить на сайт. после отправки получить ответ от сервера. В теории понятно? Как я уже написал HttpWebRequest использовать неудобно поскольку надо писать парсер для каждого поля (WebReq.Accept,WebReq.Connection,WebReq.ContentLength ...) Нужен другой вариант.
Не имею понятия о чем ты говоришь, помог как смог. А что еще остается, Wininet, Winsock или что-то еще?! Ведь ты ничего сверхсложного не делаешь, там обычные запросы которые надо парсить, вот и все. Или придумать свой алгоритм обработки данных - послать, получить, проверить/сверить, изменить и отправить заново. И так бесконечно в цикле пока получишь нужный тебе ответ.
можно сделать через Soket. я сделал так но роботает криво очень. PHP: Socket s //Socket NetworkStream ns = new NetworkStream(s); StreamWriter sw_socket = new StreamWriter(ns); StreamReader sr_socket = new StreamReader(ns); PHP: sw_socket.Write(request);//Отправили запрос "GET ..." sw_socket.Flush(); Проблема тут PHP: Char[] readBuffer = new Char[128]; int count = 0; do { count = sr_socket.Read(readBuffer, 0, 128); otvet_tmp = new string(readBuffer, 0, count); otvet_full += otvet_tmp;//Ответ сервера } while (count > 0); sr_socket.Close(); Роботает криво.
Не тестировал, первое что пришло в голову. Code: HttpWebRequest req = HttpWebRequest.Create("http://google.com"); //Расставляем заголовки тут stream resp = req.GetRequestStream; StreamReader sr = new StreamReader(resp); string mypage = sr.ReadToEnd(); //Код для парсинга страницы sr.Dispose();
PHP: GET http://www.google.com.ua/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: uk User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: www.google.com.ua Cookie: lolnoob а это куда вставить ? Мне нужно этот запрос (в таком виде) отправить на сайт и получить ответ.
в HttpWebRequest Class нельзя просто вставить запрос. Там надо прописовать в каждое свойство. А мне так не подходит поскольку у меня запрос целий идет. А писать парсер, для HttpWebRequest для каждого поля глупость.
Ну сделай класс который будет принимать только те параметры которые тебе нужны + сам дописывать то что тебе надо.
причем сдесь параметры. Сотри. Мне надо отправить http запрос как он есть строкой и получить ответ. И все. мне не надо: Я ж код дал выше.
через netcat: cat request.txt | netcat site.com 80 > response.txt при этом request.txt содержит полностью GET или POST запрос Мне такое на шарпе )
Немного разобрался но ответ так и не нашел. Как с такого PHP: GET http://www.google.com.ua/ HTTP/1.1 Accept: [SIZE=1]image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* [/SIZE] Accept-Language: uk User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: www.google.com.ua Cookie: lolnoob Сделать request.Accept Взять image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* requset.User-Agent Взять Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; requset.Accept-Encoding Взять gzip, deflate и т.д Передать Запрос в виде строчки и получить что-то что можно впихнуть в HttpWebRequest. Думаю правда хранится в RequestContext, HttpContex, HttpRequest просвитите
Ну так в Soket его, в Socket или в TcpClient, только если там будет gzip,chunked,Ssl придется делать еще и инкапсуляцию всего этого добра. Только зачем это надо то, непонятно.