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

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

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

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

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

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

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

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

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

Добавлено через 53 секунды
+ размер локального буфера поставь на 1-4мб
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
17.08.2015, 14:35  [ТС] 5
Цитата Сообщение от агерон Посмотреть сообщение
читай пока 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
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.08.2015, 15:39 6
body90, а что за массив, в котором лежит запрос? Что под этим конкретно подразумевается? Encoding.GetBytes(...) ?
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
18.08.2015, 00:09  [ТС] 7
Цитата Сообщение от Psilon Посмотреть сообщение
а что за массив
Это массив данных, который я получаю от браузера.
Запрос от браузера я получаю этим же методом GetRequest, просто передавая в него Socket, связанный с браузером.
Цитата Сообщение от Psilon Посмотреть сообщение
Что под этим конкретно подразумевается?
Подобие прокси, но со своим промежуточным функционалом для статистики.
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.08.2015, 02:18 8
ну так и пиши свой прокси унаследовав его от стандартного WebProxy
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
18.08.2015, 22:11  [ТС] 9
Цитата Сообщение от агерон Посмотреть сообщение
ну так и пиши свой прокси унаследовав его от стандартного WebProxy
И как это избавит меня от надобности отправлять запрос и ответ?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.08.2015, 22:43 10
body90, пример массива? Просто мб его можно распарить и отправить соответствующий запрос. Я с корпоратива и не совсем верно выражаю мысли, если етсь вопросы и уточнения, то задавай
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
19.08.2015, 01:39  [ТС] 11
Psilon, Вы правильно понимаете. Массив - это HTTP запрос, отправленный браузером в мой прокси. Этот массив возвращает метод byte[] GetRequest(Socket client) Там лежит просто запрос в виде byte[]. Вот этот же запрос я пересылаю дальше серверу назначения и мне нужно получить от него ответ.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 03:20 12
body90, ну я имел ввиду, что если формат массива известен можно его с помощью GetString() распарсить как строку и сделать обычг request. Как массив я, честно говоря, не пробовал никогда пересылать. Обычно уровень немного больший у абстракции, нежели просто byte[]
1
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
19.08.2015, 05:42  [ТС] 13
Цитата Сообщение от Psilon Посмотреть сообщение
если формат массива известен можно его с помощью GetString() распарсить как строку и сделать обычг request
Ну правильно. Я получаю запрос от браузера в виде byte[], которые вернул метод byte[] GetRequest(Socket client), потом превращаю в строку, вытягиваю из них хост с потром и на этот хост создаю новый сокет {2} и посылаю туда этот же полученный мною массив байт. Потом читаю, что мне пришло на сокет {2} и возвращаю в сокет браузера.

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

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

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

-или-

Произошел отказ в процессе чтения из сети.
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
20.08.2015, 08:43  [ТС] 15
Psilon, ниже в заметках написано
Если отсутствуют данные для чтения, метод Read возвращает значение 0. Операция Read читает такой объем доступных данных, который указан (в байтах) в параметре size. Если удаленный узел разрывает подключение и все доступные данные прочитаны, метод Read немедленно завершается и возвращает нулевое количество байтов.
Вообще, проблема в том, что client.Connected возвращает true. Значит сокет ещё открыт. Но метод .Read() блокируется в попытках чтения до истечения таймаута и выкидывает этот эксепшн. По логике, если соединение открыто, значит есть только 2 варианта: или там есть данные, или их там нет. В любом из этих случаев, этот метод должен нормально вернуть значение.
P.S. - я получаю исключение в момент получения запроса от браузера, а не ответа от удалённого сервера. Не ожидал подвоха при получении данных по локалхосту.
0
20.08.2015, 08:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2015, 08:43
Помогаю со студенческими работами здесь

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

Как получить ответ от сервера?
Как мне получить ответ от сервера с помощью класса HttpResponseMessage ? если мне надо не только...

Как получить ответ от сервера?
Здравствуйте. Принимаю запрос с сервера вот таким кодом : HttpWebRequest WReq =...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru