Clipper On Line • Ver Tópico - Definir timeou para resquest Send()
Página 1 de 2

Definir timeou para resquest Send()

MensagemEnviado: 08 Nov 2020 21:45
por asimoes
SetTimeouts

With Object ::oServerWS
   nResolve = 5 * 1000 
   nConnect = 5 * 1000 
   nSend    = 15 * 1000 
   nReceive = 15 * 1000 
   cSOAPAction    := "http://tempuri/RevertePagamentoLoteOP"
   :SetTimeouts( nResolve, nConnect, nSend, nReceive )
   :Open( "POST", ::cUrlWS, .F. )
   :setRequestHeader( "SOAPAction", cSOAPAction )
   :SetRequestHeader( "Content-Type", 'text/xml; charset="utf-8"' )
   :SetRequestHeader( "Content-Length", hb_NtoS( hb_BLen( cXMLSoap ) ) )
   :Send( ::oXMLDoc:xml )
   Do While :readyState != 4
      hwg_DoEvents()
      :WaitForResponse( 500 )
   Enddo
  ::cResponseText := :responseText
End


Definir timeout para resquest

https://stackoverflow.com/questions/14052543/how-to-set-http-timeout-using-asp

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 07:46
por asimoes
Tem que ir ajustando, aumentei nSend (SEND) para 30
O default do SetTimeouts é 120 segundos (2 min) para resposta do serviço

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 09:56
por JoséQuintas
Sei não....

:WaitForResponse( n ) define o tempo de espera.

Definir novamente o tempo.... acho que seria tarde demais, já que o timeout já foi esgotado.

      oServer:Send( ::cXmlSoap )
      oServer:WaitForResponse( ::nSoapTimeOut )
      cRetorno := oServer:ResponseBody()


A novidade seria a função com os parâmetros:

setTimeouts (long resolveTimeout, long connectTimeout, long sendTimeout, long receiveTimeout)

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:01
por JoséQuintas
Estranhei esta parte:

And the point is that OP wants a 15-seconds timeout. Due to your code, operation may exceed 15 seconds. This is not an asynchronous request
...
you are right. I changed to SYNCHRONOUS, which is what the OP wants and changed the send/receive timeouts to 15 secs

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:06
por asimoes
JoséQuintas escreveu::WaitForResponse( n ) define o tempo de espera.


Não funciona!

Pode colocar qq mensagem dentro desse while
            :Send( ::oXMLDoc:xml )
            Do While :readyState != 4
               hwg_DoEvents()
               :WaitForResponse( 500 )
            Enddo

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:09
por JoséQuintas
Tem as duas funções: SetTimeOuts() e WaitForResponse().
Me parece que uma define apenas pra resposta, e a outra define geral.

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:11
por JoséQuintas
Vou testar depois, pra ver se muda alguma coisa.

      //setTimeouts( long resolveTimeout, long connectTimeout, long sendTimeout, long receiveTimeout )
      //oServer:SetTimeOuts( ::nSoapTimeOut, ::nSoapTimeOut, ::nSoapTimeOut, ::nSoapTimeOut )
      oServer:Open( "POST", ::cSoapURL, .F. )
      oServer:SetRequestHeader( "Content-Type", "application/soap+xml; charset=utf-8" )
      oServer:Send( ::cXmlSoap )
      oServer:WaitForResponse( ::nSoapTimeOut )

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:11
por asimoes
Quando o serviço está fora o send() espera até 2 min. para responder o WaitForResponse ignora isso

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:13
por JoséQuintas
Lembrando: timeout é o LIMITE de tempo.
Se der erro antes desse tempo... não tem mais o que esperar.

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:15
por JoséQuintas
asimoes escreveu:Quando o serviço está fora o send() espera até 2 min. para responder o WaitForResponse ignora isso


Aí que está: WaitForResponse() é tempo pra esperar resposta, não para o send.
Acho que o SetTimeOuts() é mais abrangente.

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:18
por asimoes
SetTimeOuts define o tempo limite de resposta pata o Send se não for definido o default é 2 minutos, nunca vi o waitresponse funcionando

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:32
por JoséQuintas
Tô pensando aqui....

Talvez o SetTimeOuts() defina o tempo para a função da Microsoft.
E talvez o WaitForResponse() seja o tempo do APLICATIVO esperar.
Se for assim, as duas trabalham em conjunto, cada uma definindo uma coisa.

E aí sua rotina faz sentido, porque seria o tempo do aplicativo esperar.

O que acaba deixando na dúvida sobre o que acontece com a rotina Microsoft, se ela continuar esperando mesmo depois que o aplicativo não quer mais a resposta.

O problema vai ser como testar isso, já que depende de endereço falhando.

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:41
por JoséQuintas
Atenção que o uso é em lugares diferentes, pra dar certo.
Se vai configurar o tempo de Open() e Send(), precisa ser ANTES do uso.

      //setTimeouts( long resolveTimeout, long connectTimeout, long sendTimeout, long receiveTimeout )
      oServer:SetTimeOuts( ::nSoapTimeOut, ::nSoapTimeOut, ::nSoapTimeOut, ::nSoapTimeOut )
      oServer:Open( "POST", ::cSoapURL, .F. )
      oServer:Send( ::cXmlSoap )
      oServer:WaitForResponse( ::nSoapTimeOut )

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 10:50
por sygecom
Em alguns lugar usei assim:
oServer:setTimeouts(1000*60, 1000*60, 0, 0) // PARAMETRO ZERO É INFINITO

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 11:08
por asimoes
Parâmetro 0 vai travar a aplicação

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 11:13
por JoséQuintas
E usuário não vai esperar 60 segundos.... sei não....
Por enquanto alterei aqui a SefazClass pra usar mesmo limite em tudo, e não fez diferença no uso normal.
Precisa esperar uma situação com problema agora....

E fico na dúvida se precisa tempo no WaitForResponse(), já que SetTimeOuts() já definiu o limite.

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 13:52
por asimoes
Um teste bom é fechar a conexão da internet

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 14:07
por asimoes
Fiz um teste aqui passando nSend com 0 (zero), saiu com 8 segundos

Definir timeou para resquest Send()

MensagemEnviado: 09 Nov 2020 15:51
por sygecom
asimoes escreveu:Parâmetro 0 vai travar a aplicação

Aqui nunca travou, mas confesso que não fiz tanto teste assim.