На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Поддержание TCP подключения в HttpWebRequest , Поддержание TCP подключения в HttpWebRequest
    Здравствуйте! Как в рамках одного экземпляра объекта HttpWebRequest (вызвав один раз метод Create) выполнить несколько запросов POST на сервер. При этом использовать одно TCP соединение и не рубить его после каждого запроса.
    В перехватчике Wireshark чётко видно что запрос фин-аск уходит от клиента после операции myStreamReader.ReadToEnd();

    ExpandedWrap disabled
                  _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 подключения?
      Мне кажется, что тут не все зависит от клиента, а и от сервера тоже, который по своей инициативе может рвать соединение.

      А вообще есть еще HttpWebRequest.KeepAlive
        То что связь рвёт клиент - это 100% видно в перехвате. С KeepAlive игрался, не помогает. К тому же делал ещё так

        ExpandedWrap disabled
          Uri site = new Uri("http://" + prm[3] + "/x.php");
          ServicePoint sp = ServicePointManager.FindServicePoint(site);
          sp.MaxIdleTime = Timeout.Infinite;
          sp.SetTcpKeepAlive(true, 4000, 3000);


        но увы...
          Всё ребята, разобрался, дело было в заголовках ответа. В ответе в поле Connection должно быть Keep-Alive. И тогда все запросы идут по одному сокету.
            Цитата Artemprodigy @
            Всё ребята, разобрался, дело было в заголовках ответа. В ответе в поле Connection должно быть Keep-Alive. И тогда все запросы идут по одному сокету.

            Именно, должно быть "Connection: Keep-Alive". Если такой заголовок отсутствует, большинство HTTP-серверов подставляют дефолтный "Connection: Close" и закрывают соединение после отправки ответа.

            Цитата Artemprodigy @
            sp.SetTcpKeepAlive(true, 4000, 3000);

            А вот такое регулирование не работает именно по той причине, что разрыв инициируется серверной стороной, а не клиентской.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0190 ]   [ 16 queries used ]   [ Generated: 28.03.24, 21:57 GMT ]