Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2016, 11:08   #1
Моржовый
Новичок
Джуниор
 
Регистрация: 22.04.2016
Сообщений: 1
По умолчанию Циклический Post-запрос

Добрый день.
Ситуация вкратце такая: в отдельном потоке крутится цикл Post-запроса. IdHttp-компонент описывается и убивается вне цикла.В самом теле только вызывается метод Post.
Код:
 paramstr:= 'username='+UserName+'&password='+UserPassword;
 Params := TStringStream.Create();
 Params.WriteString(paramstr);
 Res1 :=  TStringStream.Create();
try
 HttpClientToken := TIdHttp.Create(nil) ;
 //HttpClientToken.ReuseSocket:=rsTrue;//1
 HttpClientToken.Request.ContentType := 'application/x-www-form-urlencoded';
 HttpClientToken.Request.Connection  := 'Keep-Alive';//2
 HttpClientToken.Request.Accept := 'application/json' ;
 HttpClientToken.ReadTimeout    := 60000 ;
 HttpClientToken.Request.CustomHeaders.Add('X-Application:'+AppKey) ;
 HttpClientToken.Request.CustomHeaders.Add('Connection: keep-alive');//3
 HttpClientToken.HTTPOptions :=  [ hoKeepOrigProtocol ];
 sslIOHandlerToken:= TIdSSLIOHandlerSocketOpenSSL.Create(HttpClientToken) ;
 //sslIOHandlerToken.ReuseSocket:=rsTrue;//5
 HttpClientToken.IOHandler := sslIOHandlerToken ;


 while not(Terminated) do
   begin
 if not(SessionToken.TokenValidate) or (MinutesBetween(SessionToken.TokenTime,Now)>=10) then

                       begin
  res1.Clear;

  try
   HttpClientToken.Post(URLSource,Params,Res1) ;
   except
   Logging('TokenRequestLog',Res1.DataString);
    
  end;
  HttpClientToken.Disconnect;// 4
  end;
   Sleep(10000);
                       end;
  finally
  HttpClientToken:= nil;
  HttpClientToken.Free;
  sslIOHandlerToken:= nil;
  sslIOHandlerToken.Free;
  Res1 := nil;
  Res1.Free;
  Params := nil;
  Params.Free;
  end;
Этот код работает. Но:
1. при передаче параметра "keep-alive" (строка //2) соединение не должно закрываться и в заголовке ответного сообщения добавляется "Connection: keep-alive". В ответном сообщении этого заголовка нет.
2. При комментировании строки //2 и явной передаче заголовка (стока //3. В ответном сообщении так же не приходит "keep-alive".
3. Строка //4-это костыль. Поскольку, учитывая пункты 1 и 2, соединение не считается "живым" и по истечению стандартного таймаута - 300с при вызове Post возникает исключение Connection refused by peer.
4. По поводу строк //1 и //5: если их раскомментировать и закомментировать HttpClientToken.Disconnect, то после истечения 300 секунд, возникнет исключение SocketError#0.
В конечном итоге, в определенный момент времени, после ряда таких исключений, Post будет постоянно вызывать исключение (сразу при запуске потока и первом же вхождении в цикл) Connection refused by peer до момента перезагрузки системы. Похоже, это связано с тем, что сокеты остаются корректно не закрытыми.
Вопроса, в принципе два: по каким причинам может не передаваться заголовок "keep-alive". И почему без принудительного дисконнекта Post вызывает исключение
Моржовый вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
POST запрос Rybis Общие вопросы C/C++ 8 30.07.2015 22:19
Циклический веб-запрос с меняющейся частью адресной строки allkry Microsoft Office Excel 4 20.10.2014 14:34
POST запрос timyr1997 Работа с сетью в Delphi 2 05.07.2010 20:54
POST запрос DeDoK Работа с сетью в Delphi 6 12.07.2009 00:48