Página 1 de 2
Definir timeou para resquest Send()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
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()
Enviado:
09 Nov 2020 11:08
por asimoes
Parâmetro 0 vai travar a aplicação
Definir timeou para resquest Send()
Enviado:
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()
Enviado:
09 Nov 2020 13:52
por asimoes
Um teste bom é fechar a conexão da internet
Definir timeou para resquest Send()
Enviado:
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()
Enviado:
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.