обращение к http серверу
От: alex1010  
Дата: 30.07.15 11:48
Оценка:
Такой вот тупой вопрос,
обращение к http серверу, шлем запрос и работаем с потоком от него —

HttpWebRequest req = ( HttpWebRequest )WebRequest.Create( recordingUrl );
req.Method = "GET";
req.Credentials = credentialCache;
resp = req.GetResponse();
stream = resp.GetResponseStream();


если через какое-то время надо снова подать запрос, не связанный с предыдущим, как собственно надо делать?
сначала убъем текущий? —

stream.Close();
stream.Dispose();
resp.Close();
resp.Dispose()


а потом все заново?

Сервак после нескольких таких быстро сменяющих друг друга запросов кидает "503 Service Unavailable". Такое впечатление, что он не убивает быстро старые коннекты и отваливается по превышению числа коннектов.

Сказали, что надо использовать старое соединение. Но как это сделать? Новая команда, это новый recordingUrl, а у WebRequest есть вроде только команда Create для задания Url, которая создаст очевидно новый объект. Т.е старому все равно придет Dispose.
Это вообще возможно (и правильно) делать другие запросы используя старый HttpWebRequest?
Re: обращение к http серверу
От: alex1010  
Дата: 31.07.15 06:47
Оценка:
вопрос настолько тупой или настолько сложный?
Re: обращение к http серверу
От: Venom  
Дата: 31.07.15 08:34
Оценка:
Здравствуйте, alex1010, Вы писали:

A>если через какое-то время надо снова подать запрос, не связанный с предыдущим, как собственно надо делать?

Да, закрываем первый реквест/стрим и собираем новый. Посылаем новый запрос из нового HttpWebRequest.

A>Сервак после нескольких таких быстро сменяющих друг друга запросов кидает "503 Service Unavailable". Такое впечатление, что он не убивает быстро старые коннекты и отваливается по превышению числа коннектов.

Попробуй воспроизвести это на Яндексе: http://ya.ru

A>Сказали, что надо использовать старое соединение.

Чего? HttpWebRequest это и есть "старое" соединение. Более "новые" соединения это WebClient и HttpClient.
>Но как это сделать? Новая команда, это новый recordingUrl, а у WebRequest есть вроде только команда Create для задания Url, которая создаст очевидно новый объект.
Ты не можешь создать HttpWebRequest через new HttpWebRequest. Работая с HttpWebRequet ты его всегда создаешь через (HttpWebRequest)WebRequest.Create.
Попробуй прочитать какой-нибудь мануал по теме, например: http://www.codeproject.com/Articles/6554/How-to-use-HttpWebRequest-and-HttpWebResponse-in-N

A>Это вообще возможно (и правильно) делать другие запросы используя старый HttpWebRequest?

Никто так не делает.

Вообще, изложи что вообще ты пытаешься сделать. Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?
Re: обращение к http серверу
От: pugv Россия  
Дата: 31.07.15 08:54
Оценка: 3 (1)
Здравствуйте, alex1010, Вы писали:

A>
stream.Close();
stream.Dispose();
resp.Close();
resp.Dispose()


Да, кстати достаточно любого одного из этих вызовов.

A>а потом все заново?


Да.

A>Сервак после нескольких таких быстро сменяющих друг друга запросов кидает "503 Service Unavailable". Такое впечатление, что он не убивает быстро старые коннекты и отваливается по превышению числа коннектов.


Не будет новых коннектов. keepalive же. Скорее всего на сервере просто анти-DoS.

A>Это вообще возможно (и правильно) делать другие запросы используя старый HttpWebRequest?


Нет.
Re[2]: обращение к http серверу
От: pugv Россия  
Дата: 31.07.15 08:59
Оценка: 3 (1) +1
Здравствуйте, Venom, Вы писали:

V> Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?


WebRequest куда гибче. Пулы подключений, буферизация, keepalive, заголовки, куки...
Нужно ли это ТС —
Re[3]: обращение к http серверу
От: IB Австрия http://rsdn.ru
Дата: 31.07.15 10:58
Оценка:
Здравствуйте, pugv, Вы писали:


P>WebRequest куда гибче. Пулы подключений, буферизация, keepalive, заголовки, куки...

WebRequest куда кривее. Он не умеет правильно обрабатывать статусы с сервера, асинхронность и в целом странный.
Мы уже победили, просто это еще не так заметно...
Re[3]: обращение к http серверу
От: fddima  
Дата: 01.08.15 07:59
Оценка: 3 (1)
Здравствуйте, pugv, Вы писали:

V>> Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?

P>WebRequest куда гибче. Пулы подключений, буферизация, keepalive, заголовки, куки...
P>Нужно ли это ТС —
В HttpClient это всё есть. Нужно просто или доки читать, или хоть чуть-чуть пробовать самому.
Делается один инстанс HttpClient и с ним ведется работа. Этот инстанс HttpClient и будет выступать этим самым пулом/keepalive.
Заголовки и прочее — всё это тоже делается.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: обращение к http серверу
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.08.15 10:30
Оценка:
Здравствуйте, pugv, Вы писали:

P>Здравствуйте, Venom, Вы писали:


V>> Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?


P>WebRequest куда гибче. Пулы подключений, буферизация, keepalive, заголовки, куки...

P>Нужно ли это ТС —
http://stackoverflow.com/questions/12373738/how-do-i-set-a-cookie-on-httpclients-httprequestmessage
и солнце б утром не вставало, когда бы не было меня
Re: обращение к http серверу
От: Mr.Delphist  
Дата: 03.08.15 10:56
Оценка: +1
Здравствуйте, alex1010, Вы писали:

A>Сервак после нескольких таких быстро сменяющих друг друга запросов кидает "503 Service Unavailable". Такое впечатление, что он не убивает быстро старые коннекты и отваливается по превышению числа коннектов.


Если автор не слышал про SO_REUSEADDR, то да — исчерпывается пул портов, т.к. по дефолту порт схлопывается не сразу, а через таймаут. Поэтому попытка обработать входящий коннект обламывается на сервере, пока не умрёт кто-то из "старых" полузакрытых портов. Особенно актуально, если на серваке какая-то домашная винда не первой свежести, там вообще может быть правило "10 входящих коннектов MAX"
Re[2]: обращение к http серверу
От: alex1010  
Дата: 04.08.15 15:14
Оценка:
вообще я не досказал, обращение идет к видео-серверу, который шлет видео-поток по запросу.
Поэтому первая команда, на запуск видео —
req = ( HttpWebRequest )WebRequest.Create( recordingUrl );
..
resp = req.GetResponse();
stream = resp.GetResponseStream();

вообще не убивается (не вызывается Dispose) пока надо проигрывать этот кусок видео, тк. тогда коннект сразу оборвется и поток с видео конечно тоже.

Но есть еще, скажем, команды изменения скорости проигрывания, которые вызываются много раз и там Dispose для resp и req = null, вызывается после выполнения.
Во всяком случае, сейчас любая команда — это новый HttpWebRequest.
И периодически она фейлится по "503".


A>>Сказали, что надо использовать старое соединение.

V>Чего? HttpWebRequest это и есть "старое" соединение. Более "новые" соединения это WebClient и HttpClient.

имелось ввиду — сказали, что надо использовать созданный HttpWebRequest, каким-то образом подставляя в него новый url-команду и тем самым не создавая новый объект. Вообще это не так чтобы укладывается в протокол http насколько знаю, но я поверил и полез искать.


V>Вообще, изложи что вообще ты пытаешься сделать. Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?


я просто видел пример для HttpWebRequest, и на нем сделал.
Re[2]: обращение к http серверу
От: alex1010  
Дата: 04.08.15 15:15
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, alex1010, Вы писали:


A>>Сервак после нескольких таких быстро сменяющих друг друга запросов кидает "503 Service Unavailable". Такое впечатление, что он не убивает быстро старые коннекты и отваливается по превышению числа коннектов.


MD>Если автор не слышал про SO_REUSEADDR, то да — исчерпывается пул портов, т.к. по дефолту порт схлопывается не сразу, а через таймаут. Поэтому попытка обработать входящий коннект обламывается на сервере, пока не умрёт кто-то из "старых" полузакрытых портов. Особенно актуально, если на серваке какая-то домашная винда не первой свежести, там вообще может быть правило "10 входящих коннектов MAX"


а как это прикрутить к соединению через HttpWebRequest?
Re[3]: обращение к http серверу
От: Mr.Delphist  
Дата: 04.08.15 15:59
Оценка:
Здравствуйте, alex1010, Вы писали:

A>а как это прикрутить к соединению через HttpWebRequest?


Автор серверной части — тоже Вы? Тогда показывайте код, как сервак слушает входящие запросы.
С клиентской стороны тут делать ничего не надо — это заморочки сервера (точнее, слушающей стороны).
Re[4]: обращение к http серверу
От: alex1010  
Дата: 06.08.15 06:55
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, alex1010, Вы писали:


A>>а как это прикрутить к соединению через HttpWebRequest?


MD>Автор серверной части — тоже Вы? Тогда показывайте код, как сервак слушает входящие запросы.

MD>С клиентской стороны тут делать ничего не надо — это заморочки сервера (точнее, слушающей стороны).

Увы, автор Sony.
https://pro.sony.com/bbsc/ssr/mkt-security/resource.downloads.bbsccms-assets-cat-camsec-downloads-RealShotManagerAdvanced.shtml

Там ничего не поменять.
Re[3]: обращение к http серверу
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.08.15 07:57
Оценка:
Здравствуйте, alex1010, Вы писали:




V>>Вообще, изложи что вообще ты пытаешься сделать. Почему ты пытаешься использовать древний HttpWebRequest, когда есть HttpClient?


A>я просто видел пример для HttpWebRequest, и на нем сделал.

Ну так перепиши под HttpClient. Там можешь подставлять нужный тебе url-команду используя BaseAddress . Причем получишь еще профит от асинхронных операций.
https://msdn.microsoft.com/ru-ru/library/windows/apps/xaml/Hh781239.aspx
http://blogs.msdn.com/b/henrikn/archive/2012/08/07/httpclient-httpclienthandler-and-httpwebrequesthandler.aspx
и солнце б утром не вставало, когда бы не было меня
Отредактировано 06.08.2015 8:13 Serginio1 . Предыдущая версия . Еще …
Отредактировано 06.08.2015 8:04 Serginio1 . Предыдущая версия .
Отредактировано 06.08.2015 7:58 Serginio1 . Предыдущая версия .
Re[3]: обращение к http серверу
От: _Raz_  
Дата: 09.08.15 12:02
Оценка:
Здравствуйте, alex1010, Вы писали:

A>вообще не убивается (не вызывается Dispose) пока надо проигрывать этот кусок видео, тк. тогда коннект сразу оборвется и поток с видео конечно тоже.


Для такой задачи я использовал HttpClient засетапленный с HttpCompletionOption.ResponseHeadersRead. Так вот была тонкость в том, что нужно было поставить client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);.
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.