2009-10-02 10 views
7

Aquí está la esencia:¿Cómo activo una llamada asincrónica en asp classic e ignoro la respuesta?

Tengo una llamada que quiero hacer en asp, y no me importa la respuesta. Solo quiero activar la llamada y no quiero que la página espere la respuesta. Según la documentación, debe ser algo como esto:

dim xmlhttp : set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP") 
xmlhttp.Open "POST", url, true '' setting the 'asynchronous' option to 'true' 
xmlhttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8" 
xmlhttp.setRequestHeader "Content-Length", Len(XMLData) 
xmlhttp.send XMLData 

Esto funciona color de rosa al llamar de forma sincrónica, pero cuando le doy la vuelta a la opción ansynchronous 'verdaderos', incendios nada. Lo que he entendido a través de Internet es que los usuarios hagan algo como lo siguiente:

While xmlhttp.readyState <> 4 
    xmlhttp.waitForResponse 1000 
Wend 

Estoy loco en que esto no parece realmente como una llamada asynchrous más, aunque si usted está esperando una respuesta?

poner la línea xmlhttp.waitForResponse 1 justo después del envío hará que la solicitud se dispare, pero de nuevo, no quiero esperar un segundo.

¿Alguna idea?

Respuesta

7

El problema clave aquí es si no espera y el script finaliza el componente ServerXMLHTTP se destruye a sí mismo y en el proceso cancela la solicitud pendiente. No hay forma de que pueda garantizar a dónde ha llegado la solicitud en ese momento.

Por ejemplo, si su servidor no se ha redirigido para emitir al servidor de destino, verá que ya no es necesario y no molesta.

Incluso si se ha realizado una conexión con el servidor de destino, es posible que aún no se haya entregado la solicitud a un controlador. A menudo, un servidor web verificará que el cliente aún esté conectado antes de comprometer recursos para cumplir una solicitud. Si ve que su conexión se ha eliminado, no le molestará completar la solicitud.

En otras palabras, no hay una manera confiable de realizar esta operación de manera asilnona en ASP clásico, simplemente no está diseñado para manejar ese tipo de cosas. Lo mejor que puedes obtener es hacer otras cosas mientras tu script se lleva a cabo con otra cosa (si tienes algo más con lo que estar trabajando), sin embargo, ni siquiera lo recomendaría ya que el WinHTTP asincrónico dentro de ASP es escamoso.

3

Usamos async XMLRequest para registrar errores en Fogbugz en nuestros sitios ASP. Como es solo un informe de error, no queremos que nuestros usuarios esperen que nuestro código termine, por lo que lo hacemos de forma asíncrona. Esto podría ser para cualquier cosa, desde un archivo de configuración faltante, tiempo de espera de DB, búsqueda faltante en un archivo de configuración en alguna parte, etc. No siempre es una tarea críptica de la misión, pero es bueno saberlo. En esos casos, la función asíncrona funciona de maravilla y, si no es así, no es el fin del mundo para nosotros, pero no hemos tenido ningún problema. Hemos estado utilizando este script que creamos y ha escrito en otra pregunta:

System.Net.HttpWebRequest in classic asp?

Al igual que Anthony dice aunque no es 100% guanenteed para pasar. Como una solución posible, puede enviar Response.Buffer = true, procesar toda su salida para el usuario, llamar a Response.Flush y luego hacer una llamada waitForResponse. El usuario verá toda la página y podrá interactuar con ella sin interrupciones y le dará a su llamada asíncrona un poco más de tiempo para finalizar.

12

Hoy tengo el mismo problema. Lo resolví utilizando el objeto "Microsoft.XMLHTTP".

dim xmlhttp 
set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP") 
xmlhttp.Open "POST", url, true 
xmlhttp.Send "" 

Y ahora la solicitud se envía de forma asíncrona y se golpea la URL de destino. Espero que ayude.

+0

excelente - gracias! – EdenMachine

+0

Acabas de salvarme de la muerte golpeando tu cabeza contra el teclado. Esto parece ser un reemplazo directo (¿no es necesario refactorizar?) Para "MSXML2.ServerXMLHTTP", pero ejecutaré regresiones solo para asegurarme. – jerhewet

2

Otra opción si aún desea utilizar el objeto ServerXMLHTTP (y no el componente del lado del cliente mencionado anteriormente por Anton ver preguntas frecuentes n. ° 4 en http://support.microsoft.com/kb/290761) es crear una clase VBScript. Crear una instancia de la clase. Establezca una propiedad de la clase al objeto HTTP. Luego llame a un método para despedir la solicitud.

No destruya nunca la instancia de clase: se destruirá automáticamente cuando finalice la página ASP. Haga que el método de destrucción de clases libere el objeto HTTP, lo que debería darle tiempo suficiente para disparar la solicitud antes de que se destruya.

Cuestiones relacionadas