Error "msxml3.dll: Se superó el tiempo de espera para la operación

139 views
Skip to first unread message

Cristian Novoa

unread,
Jun 17, 2024, 10:04:13 PMJun 17
to Comunidad de Visual Foxpro en Español
El error ocurre, al enviar un JSON con carga masiva de productos (batch), a woocommerce (con imágenes). Pasa cuando son muchos productos 50 o 100, pero con 10 productos funciona. A pesar del error y caída del proceso, sube la mayoría de los productos.

El error lo da en la línea oHTTP.send(cBody).

La llamada: cResponse=WOO_XMLHttp(cURL, cUsu, cPass,"POST",cBody).

De antemano, gracias por las sugerencias.

FUNCTION WOO_XMLHttp
PARAMETERS cURL, cUsuario, cContrasena, cVerbo, cBody
WAIT WINDOWS "Conectandose al API de Woocommerce" NOWAIT
LOCAL cAutorizacion, cRespuesta
cAutorizacion = "Basic " + STRCONV(cUsuario + ":" + cContrasena, 13)
cRespuesta=""
oHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP")
cVerbo=UPPER(cVerbo)
oHTTP.OPEN(cVerbo, cUrl, .F.)
oHTTP.setRequestHeader("Content-Type", "application/json")
oHTTP.setRequestHeader("Authorization", cAutorizacion)
DO CASE
CASE cVerbo="GET"
oHTTP.send()
CASE cVerbo="POST"
oHTTP.send(cBody)
CASE cVerbo="PUT"
oHTTP.send(cBody)
CASE cVerbo="DELETE"
oHTTP.send()
OTHERWISE
messagebox("Metodo no permitido")
RETURN cRespuesta
ENDCASE
IF oHTTP.status = 200 OR oHTTP.status=201
cRespuesta=oHTTP.responseText
ELSE
  messagebox("Error al obtener desde el API: " + oHTTP.responseText)
    ENDIF
    RELEASE oHTTP
    RETURN cRespuesta    
END FUNCTION

Jose Antonio Blasco

unread,
Jun 18, 2024, 2:56:34 AMJun 18
to publice...@googlegroups.com
Buenos días Cristian,
¿Has intentado mandar esos 100 artículos pero de 10 en 10 ?
Puede ser que el fallo lo provoque un dato en concreto.
Aunque no veas motivo, a mí me ha ocurrido que en algún dato se cuela un valor no válido y provoca el error.

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2



--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/546787f0-8c23-439d-961d-6a5bb28b412bn%40googlegroups.com.

Cristian Novoa

unread,
Jun 18, 2024, 12:31:49 PMJun 18
to Comunidad de Visual Foxpro en Español
Hola Jose. Gracias por contestar.

Puedo subir 10 productos sin problema. He subido 100 productos a la tienda y ha dado el error, con lo que cancelo la ejecución. Al ir a ver la tienda web, encuentro los 100 productos !!!.

No es un error en el JSON. Al parecer, y como lo dice el error, desde fox el comando Send no puede demorar mucho. Hay que considerar, que mis productos se suben con imágenes jpg de 800x600.

¿ Habrá otra forma de enviar el JSON a Woocommerce ?.

Daniel Sánchez

unread,
Jun 18, 2024, 1:32:21 PMJun 18
to publice...@googlegroups.com
Buenas, realiza lo que te comento Jose Antonio envia en bloque de diez en diez y asi no tendras problemas, o necesariamente debes enviar todo el paquete completo de tus productos.

Saludos



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Aarón Delgado

unread,
Jun 18, 2024, 1:49:43 PMJun 18
to publice...@googlegroups.com
Hay que probar el json con postman, si funciona, entonces es un bug de nuestros querido Fox.
Y si eso pasa, hay que cambiar el uso del MSXML2.ServerXMLHTTP por el CURL u otro componente que no es fox.

Saludos cordiales;

DELGADO JAIMES, Roberto Aarón
Fijo: 013969545 /  Movistar: 988316319



alvarocastellar

unread,
Jun 18, 2024, 3:54:00 PMJun 18
to Comunidad de Visual Foxpro en Español
Yo creo que tiene que ver mas con el numero de peticiones que se le hacen al servidor por minuto, muchas de esas api rest limitan un poco esa parte para evitar la saturacion del sitio.
revisa en la documentacion o con woocomerce  si  ellos controlan las peticiones por minuto.

Saudos

António Tavares Lopes

unread,
Jun 18, 2024, 4:21:46 PMJun 18
to Comunidad de Visual Foxpro en Español
En primer lugar, una explicación general de lo que ocurre y, a continuación, dos formas de enfocar (y resolver) el problema.

Como el método Send() se ejecuta de forma sincrónica, la instancia MSXML esperará una respuesta del servidor hasta que esté disponible.

Cuando el volumen de datos es muy grande, el servidor tarda mucho tiempo en procesar la información y, como resultado, MSXML no recibe una respuesta en el tiempo que tiene asignado para esperarla.

En esta circunstancia, cuando el servidor finalmente termina de procesar y devuelve el resultado, MSXML ya no está a la escucha. El procesamiento finaliza (incluso con éxito), pero el mensaje de finalización que el servidor devuelve al cliente se pierde.

La forma más sencilla de resolver el problema es aumentar los tiempos de espera de MSXML. Para ello, antes deHTTP.open(), ejecuteHTTP.setTimeouts(<tiempo de resolución>, <tiempo de conexión>, <tiempo de envío>, <tiempo de recepción>). El más crítico es el tiempo de recepción, que debe aumentarse (por defecto es de 30 segundos). Tenga en cuenta que todos los tiempos se indican en milisegundos. Así, para aumentar el tiempo de recepción a 5 minutos, por ejemplo, se estipularía 5 * 60 * 1000.

El problema de esta solución es que el sistema se colgará mientras no se reciba el mensaje de finalización.

Una forma más interesante sería hacer la transacción asíncrona. En otras palabras, los datos se envían pero el servicio HTTP regresa inmediatamente, señalando el evento de finalización más tarde.

Desafortunadamente, MSXML no expone eventos relacionados con el intercambio de mensajes, por lo que sería necesario utilizar otra clase para soportar el envío asíncrono. Los objetos WinHTTPRequest proporcionan este soporte.

Consulte esta discusión en https://www.tek-tips.com/viewthread.cfm?qid=1828591 para ver un ejemplo de una implementación muy sencilla pero totalmente funcional que demuestra la capacidad de respuesta del sistema incluso cuando se ejecutan llamadas HTTP.

(traducción DeepL)

Cristian Novoa

unread,
Jun 18, 2024, 7:17:29 PMJun 18
to Comunidad de Visual Foxpro en Español
Muchas gracias Antonio, excelente y detallada explicación.

¿ Tendrás algunos ejemplos prácticos de ejecuteHTTP.setTimeouts ?, ojalá explicando cada parámetro.

Hendell Mora

unread,
Jun 18, 2024, 7:26:19 PMJun 18
to publice...@googlegroups.com
SetTimeouts Method (it-berater.org)



Este ejemplo viene en el link que te dejó Antonio
LOCAL Demo AS ViewRandomImage

m.Demo = CREATEOBJECT("ViewRandomImage")
m.Demo.Show()
READ EVENTS

DEFINE CLASS ViewRandomImage AS Form

	ADD OBJECT editMe AS EditBox WITH Top = 4, Left = 4, Width = 300, Height = 200, ;
		Value = "Edit me while images are being downloaded..."
	ADD OBJECT clicker AS CommandButton WITH Top = 220, Left = 4, Caption = "Click me", Autosize = .T.
	ADD OBJECT clickCounter AS Label WITH Top = 254, Left = 4, Caption = "Clicked 0 times", Autosize = .T.

	ADD OBJECT Viewer AS Image WITH Top = 4, Left = 308, Width = 1000, Height = 500
	ADD OBJECT Reloader AS Timer WITH Interval = 5000

	Downloader = .NULL.

	Clicks = 0

	Width = 1350
	Height = 520

	PROCEDURE Init ()

		This.Downloader = CREATEOBJECT("DownloadRandomImage", This)
		WITH This.editMe AS Editbox
			.SelStart = 0
			.SelLength = LEN(.Value)
			.SetFocus()
		ENDWITH

	ENDPROC

	PROCEDURE Destroy ()

		CLEAR EVENTS

	ENDPROC

	PROCEDURE clicker.Click ()

		Thisform.Clicks = Thisform.Clicks + 1
		Thisform.clickCounter.Caption = "Clicked " + LTRIM(STR(Thisform.Clicks)) + " time" + IIF(Thisform.Clicks != 1, "s", "")

	PROCEDURE Reloader.Timer ()

		IF ! ISNULL(Thisform.Downloader)
			Thisform.Downloader.Download()
		ENDIF

	ENDPROC

	PROCEDURE Callback (StatusCode AS Integer, ImageBlob AS Blob)

		IF BETWEEN(m.StatusCode, 200, 299)
			This.Viewer.PictureVal = m.ImageBlob
		ENDIF

	ENDPROC 

ENDDEFINE

DEFINE CLASS DownloadRandomImage AS Custom

	IMPLEMENTS IWinHttpRequestEvents IN "WinHttp.WinHttpRequest.5.1"

	HTTPService = .NULL.
	CallerForm = .NULL.

	FUNCTION Init (Caller AS Form)

		This.CallerForm = m.Caller

	ENDFUNC

	FUNCTION Destroy ()

		This.CallerForm = .NULL.
		This.HTTPService = .NULL.

	ENDFUNC

	FUNCTION Download ()

		IF ! ISNULL(This.HTTPService)
			TRY
				This.HTTPService.Abort()
			CATCH
			ENDTRY
			This.HTTPService = .NULL.
		ENDIF
		This.HTTPService = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
		This.HTTPService.setTimeouts(0, 30000, 60000, 60000)
		EVENTHANDLER(This.HTTPService, This)

		This.HTTPService.Open("Get", "https://picsum.photos/1000/500", .T.)
		This.HTTPService.Send()

	ENDFUNC

	PROCEDURE IWinHttpRequestEvents_OnError (ErrorNumber, ErrorDescription)
	ENDPROC

	PROCEDURE IWinHttpRequestEvents_OnResponseDataAvailable (Data)
	ENDPROC

	PROCEDURE IWinHttpRequestEvents_OnResponseFinished

		TRY
			This.CallerForm.CallBack(This.HTTPService.status, This.HTTPService.responseBody)
		CATCH
		ENDTRY

	ENDPROC

	PROCEDURE IWinHttpRequestEvents_OnResponseStart (Status, ContentType)
	ENDPROC

ENDDEFINE 

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

António Tavares Lopes

unread,
Jun 18, 2024, 7:27:00 PMJun 18
to Comunidad de Visual Foxpro en Español
Por ejemplo,

...
oHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0")
cVerbo=UPPER(cVerbo)
   && resolución: infinito, conéxion: 60 segundos, envío: 30 segundos, recepción: 5 minutos
oHTTP.setTimeouts(0, 60 * 1000, 30 * 1000, 5 * 60 * 1000) 
oHTTP.OPEN(cVerbo, cUrl, .F.)
...

Cristian Novoa

unread,
Jun 18, 2024, 9:31:34 PMJun 18
to Comunidad de Visual Foxpro en Español
Gracias " hendell.mora".

De nuevo gracias Antonio, eres muy generoso.

Cristian Novoa

unread,
Jun 19, 2024, 11:36:52 AM (14 days ago) Jun 19
to Comunidad de Visual Foxpro en Español
El proceso mejoró con la línea oHTTP.setTimeouts(0, 60 * 1000, 30 * 1000, 5 * 60 * 1000) . Suben más productos e imágenes.

Pero cuando son muchos productos, ahora da uno de los dos de los siguientes errores:

"503 Server Unavailable, The Server is Temporarily Busy, try again later!"
"500 Internal Server Error, This request takes too long to process, it is timed  out by the server. It it should not be timed out, please contact administrator of this web site to increase 'Connection Timeout'"

Al parecer, hasta el momento, si uso el modo batch para enviar productos (e imágenes) a woocommerce, tendré que mandarlas de 50 en 50. Me parece que el máximo son 100 productos, según la ayuda de Woocommerce.

Saludos.
Reply all
Reply to author
Forward
0 new messages