Clipper On Line • Ver Tópico - Definir timeou para resquest Send()
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Definir timeou para resquest Send()

08 Nov 2020 21:45

SetTimeouts

Código:
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()

09 Nov 2020 07:46

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()

09 Nov 2020 09:56

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.

Código:
      oServer:Send( ::cXmlSoap )
      oServer:WaitForResponse( ::nSoapTimeOut )
      cRetorno := oServer:ResponseBody()


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

Código:
setTimeouts (long resolveTimeout, long connectTimeout, long sendTimeout, long receiveTimeout)

Definir timeou para resquest Send()

09 Nov 2020 10:01

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()

09 Nov 2020 10:06

JoséQuintas escreveu::WaitForResponse( n ) define o tempo de espera.


Não funciona!

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

Definir timeou para resquest Send()

09 Nov 2020 10:09

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()

09 Nov 2020 10:11

Vou testar depois, pra ver se muda alguma coisa.

Código:
      //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()

09 Nov 2020 10:11

Quando o serviço está fora o send() espera até 2 min. para responder o WaitForResponse ignora isso

Definir timeou para resquest Send()

09 Nov 2020 10:13

Lembrando: timeout é o LIMITE de tempo.
Se der erro antes desse tempo... não tem mais o que esperar.

Definir timeou para resquest Send()

09 Nov 2020 10:15

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()

09 Nov 2020 10:18

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()

09 Nov 2020 10:32

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()

09 Nov 2020 10:41

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.

Código:
      //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()

09 Nov 2020 10:50

Em alguns lugar usei assim:
oServer:setTimeouts(1000*60, 1000*60, 0, 0) // PARAMETRO ZERO É INFINITO

Definir timeou para resquest Send()

09 Nov 2020 11:08

Parâmetro 0 vai travar a aplicação
Postar uma resposta