Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Получить ответ сервера с помошью HttpWebResponse

15.08.2015, 05:53. Показов 2445. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Возможно, сказывается то, что уже даже не ночь и мозги не варят, но столкнулся с проблемой.
У меня есть массив byte[] в котором лежит текст обычного HTTP-запроса. Хост и порт я из этого запроса уже вытянул.
Вот подскажите, как мне теперь из этого всего получить ответ от сервера в виде HttpWebResponse?
Массив byte[] с запросом в HttpWebRequest не засовывается, а без HttpWebRequest нельзя получить и HttpWebResponse.
Рассматривал ещё вариант с отправкой данных просто через Socket, но в таком случае я тоже не смогу получить ответ в HttpWebResponse.
Благодарю за внимание!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2015, 05:53
Ответы с готовыми решениями:

Получить ответ от сервера
Попробовал отправить запрос с помощью QNetworkAccessManager и QNetworkRequest, а с помощью сигнала finished получаю из QNetworkReply ответ....

Получить ответ от сервера
Добрый день! У меня возник еще один вопрос. Пишу программу которая авторизовывается на одном сайте. Заполняю HTTP заголовок так же, как...

Получить ответ от сервера
Что за команда в HttpWebRequest, при помощи которой можно узнать код ответа от сервера. По поводу HtmlAgilityPack. Если на странице...

14
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
15.08.2015, 06:21
азачем тебе HttpWebRequest/Response используй сокеты и NetStream и будет тебе счастье
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
16.08.2015, 13:28  [ТС]
агерон, затем, что не всегда в ответных заголовках приходит Content-Length. А отсюда, я не знаю сколько мне нужно ожидать байт от сервера. Хотел овесить это дело на плечи .Net. При чтении с сокета нужно заранее знать размер приходящих данных. Но не выйдет, наверное.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
16.08.2015, 23:25
читай пока Read не вернет тебе 0 вот и все

Добавлено через 53 секунды
+ размер локального буфера поставь на 1-4мб
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
17.08.2015, 14:35  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
читай пока Read не вернет тебе 0 вот и все
Почему-то сразу получаю эксепшн после прохождения таймайта, что сервер не отвечает или закрыл соединение.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
        private byte[] GetRequest(Socket client)
        {
            try
            {
                NetworkStream ns = new NetworkStream(client);
                StreamReader sr = new StreamReader(ns, Encoding.ASCII);
                client.ReceiveTimeout = 10 * 1000;
                string header = "";
                byte[] arr = null;
                int contLen = 0;
                using (MemoryStream ms = new MemoryStream())
                {
                    while (!string.IsNullOrEmpty(header = sr.ReadLine()))
                    {
                        if (header.ToLowerInvariant().Contains("content-length"))
                        {
                            string[] spl = header.Split(new string[] { ": ", ":" }, StringSplitOptions.RemoveEmptyEntries);
                            int.TryParse(spl[1], out contLen);
                        }
 
                        arr = Encoding.ASCII.GetBytes(header + "\r\n");
                        ms.Write(arr, 0, arr.Length);
                    }
                    arr = Encoding.ASCII.GetBytes("\r\n");
                    ms.Write(arr, 0, arr.Length);
                    string tmps = Encoding.ASCII.GetString(ms.ToArray());
 
                    int num = 0;
                    byte[] buffer = new byte[client.ReceiveBufferSize];
 
                    //    while ((contLen > 0) && ((num = client.Receive(buffer)) > 0))
                    //    {
                    //        ms.Write(buffer, 0, num);
                    //        contLen -= num;
                    //    }
                    //}
 
                    ns = new NetworkStream(client);
                    while ((num = ns.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, num);
                    }
 
                    byte[] buff = ms.ToArray();
                    return ms.ToArray();
                }
            }
            catch (Exception ex)
            {
                Logger.OnLog(ex.Message);
                return null;
            }
        }
Добавлено через 5 минут
IOExcaption
Не удается прочитать данные из транспортного соединения: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Источник исключения: ns.Read(buffer, 0, buffer.Length).
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.08.2015, 15:39
body90, а что за массив, в котором лежит запрос? Что под этим конкретно подразумевается? Encoding.GetBytes(...) ?
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
18.08.2015, 00:09  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
а что за массив
Это массив данных, который я получаю от браузера.
Запрос от браузера я получаю этим же методом GetRequest, просто передавая в него Socket, связанный с браузером.
Цитата Сообщение от Psilon Посмотреть сообщение
Что под этим конкретно подразумевается?
Подобие прокси, но со своим промежуточным функционалом для статистики.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.08.2015, 02:18
ну так и пиши свой прокси унаследовав его от стандартного WebProxy
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
18.08.2015, 22:11  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
ну так и пиши свой прокси унаследовав его от стандартного WebProxy
И как это избавит меня от надобности отправлять запрос и ответ?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.08.2015, 22:43
body90, пример массива? Просто мб его можно распарить и отправить соответствующий запрос. Я с корпоратива и не совсем верно выражаю мысли, если етсь вопросы и уточнения, то задавай
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
19.08.2015, 01:39  [ТС]
Psilon, Вы правильно понимаете. Массив - это HTTP запрос, отправленный браузером в мой прокси. Этот массив возвращает метод byte[] GetRequest(Socket client) Там лежит просто запрос в виде byte[]. Вот этот же запрос я пересылаю дальше серверу назначения и мне нужно получить от него ответ.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 03:20
body90, ну я имел ввиду, что если формат массива известен можно его с помощью GetString() распарсить как строку и сделать обычг request. Как массив я, честно говоря, не пробовал никогда пересылать. Обычно уровень немного больший у абстракции, нежели просто byte[]
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
19.08.2015, 05:42  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
если формат массива известен можно его с помощью GetString() распарсить как строку и сделать обычг request
Ну правильно. Я получаю запрос от браузера в виде byte[], которые вернул метод byte[] GetRequest(Socket client), потом превращаю в строку, вытягиваю из них хост с потром и на этот хост создаю новый сокет {2} и посылаю туда этот же полученный мною массив байт. Потом читаю, что мне пришло на сокет {2} и возвращаю в сокет браузера.

Добавлено через 5 минут
Дело в том, что в MSDN написано, что если сокет закрыт Stream.Read() просто возвращает 0. Но у меня этот метод всё равно выбрасывает исключение, что сокет закрыт.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 10:19
body90, да нет вроде:
https://msdn.microsoft.com/ru-... 10%29.aspx

IOException
Основной объект Socket закрыт.

ObjectDisposedException
Объект NetworkStream закрыт.

-или-

Произошел отказ в процессе чтения из сети.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
20.08.2015, 08:43  [ТС]
Psilon, ниже в заметках написано
Если отсутствуют данные для чтения, метод Read возвращает значение 0. Операция Read читает такой объем доступных данных, который указан (в байтах) в параметре size. Если удаленный узел разрывает подключение и все доступные данные прочитаны, метод Read немедленно завершается и возвращает нулевое количество байтов.
Вообще, проблема в том, что client.Connected возвращает true. Значит сокет ещё открыт. Но метод .Read() блокируется в попытках чтения до истечения таймаута и выкидывает этот эксепшн. По логике, если соединение открыто, значит есть только 2 варианта: или там есть данные, или их там нет. В любом из этих случаев, этот метод должен нормально вернуть значение.
P.S. - я получаю исключение в момент получения запроса от браузера, а не ответа от удалённого сервера. Не ожидал подвоха при получении данных по локалхосту.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2015, 08:43
Помогаю со студенческими работами здесь

Не удается получить ответ от сервера
Добрый день! Возникла проблемка. Начал писать класс для взаимодействия с сервером (AS+php) package { ...

Как получить ответ от сервера?
Какие есть способы или программа получения кода ответа от сервера?

Как получить ответ от сервера?
Как мне получить ответ от сервера с помощью класса HttpResponseMessage ? если мне надо не только код страницы, но все заголовки,версия...

Как получить ответ от сервера?
Здравствуйте. Принимаю запрос с сервера вот таким кодом : HttpWebRequest WReq = WebRequest.Create("https://csgo500.com") as...

Получить ответ от сервера, AJAX
Есть форма, которая передает пару параметров и файл. Этот код работает исправно (мне так кажется) <script> $(function () { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru