Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.145.114] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте! Как в рамках одного экземпляра объекта HttpWebRequest (вызвав один раз метод Create) выполнить несколько запросов POST на сервер. При этом использовать одно TCP соединение и не рубить его после каждого запроса.
В перехватчике Wireshark чётко видно что запрос фин-аск уходит от клиента после операции myStreamReader.ReadToEnd(); _myHttpWebRequestParam.GetRequestStream().Write(ByteArr, 0, ByteArr.Length); _myHttpWebResponse = (HttpWebResponse)_myHttpWebRequestParam.GetResponse(); var myStreamReader = new StreamReader(_myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251)); var response = myStreamReader.ReadToEnd(); Как мне выполнить этот участок кода в цикле и при этом не создавать нового TCP подключения? |
Сообщ.
#2
,
|
|
|
Мне кажется, что тут не все зависит от клиента, а и от сервера тоже, который по своей инициативе может рвать соединение.
А вообще есть еще HttpWebRequest.KeepAlive |
Сообщ.
#3
,
|
|
|
То что связь рвёт клиент - это 100% видно в перехвате. С KeepAlive игрался, не помогает. К тому же делал ещё так
Uri site = new Uri("http://" + prm[3] + "/x.php"); ServicePoint sp = ServicePointManager.FindServicePoint(site); sp.MaxIdleTime = Timeout.Infinite; sp.SetTcpKeepAlive(true, 4000, 3000); но увы... |
Сообщ.
#4
,
|
|
|
Всё ребята, разобрался, дело было в заголовках ответа. В ответе в поле Connection должно быть Keep-Alive. И тогда все запросы идут по одному сокету.
|
Сообщ.
#5
,
|
|
|
Цитата Artemprodigy @ Всё ребята, разобрался, дело было в заголовках ответа. В ответе в поле Connection должно быть Keep-Alive. И тогда все запросы идут по одному сокету. Именно, должно быть "Connection: Keep-Alive". Если такой заголовок отсутствует, большинство HTTP-серверов подставляют дефолтный "Connection: Close" и закрывают соединение после отправки ответа. Цитата Artemprodigy @ sp.SetTcpKeepAlive(true, 4000, 3000); А вот такое регулирование не работает именно по той причине, что разрыв инициируется серверной стороной, а не клиентской. |