2009-10-02 15 views
7

Ecco il succo:Come si attiva una chiamata asincrona in asp classic e si ignora la risposta?

Ho una chiamata che voglio fare in asp, e non mi interessa la risposta. Voglio solo rispondere alla chiamata e non voglio che la pagina attenda la risposta. In base alla documentazione, dovrebbe essere simile a questa:

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 

Questo funziona peachy quando si chiama in modo sincrono, ma quando ho capovolgere l'opzione ansynchronous a 'veri', incendi niente. Quello che ho potuto capire da internet è che gli utenti fanno qualcosa di simile al seguente:

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

Sono pazzo a che questo non sembra davvero come una chiamata Asynchrous più anche se si è in attesa di una risposta?

mettere la linea xmlhttp.waitForResponse 1 subito dopo l'invio causerà la richiesta di sparare, ma ancora una volta, non voglio aspettare un secondo.

Qualche idea?

risposta

7

Il problema chiave qui è che se non si attende e lo script termina, il componente ServerXMLHTTP si distrugge da solo e nel processo si interrompe la richiesta in sospeso. Non c'è modo per te di garantire dove è arrivata la richiesta in quel momento.

Ad esempio, se il server non è in grado di inviare al server di destinazione, vedrà che non è più necessario e non è più necessario.

Anche se è stata effettuata una connessione al server di destinazione, la richiesta potrebbe non essere stata ancora fornita a un gestore. Spesso un server Web controlla che il client sia ancora connesso prima di impegnare risorse per soddisfare una richiesta. Se vede che la tua connessione è stata rilasciata, non si preoccuperà di completare la richiesta.

In altre parole, non esiste un modo affidabile per eseguire questa operazione in modo asincrono nel classico ASP, ma non è progettato per gestire questo tipo di cose. Il meglio che puoi ottenere è fare altre cose mentre il tuo script va avanti con qualcos'altro (se hai qualcos'altro con cui andare avanti), tuttavia, non lo consiglierei nemmeno da quando WinHTTP asincrono all'interno di ASP è instabile.

3

Usiamo XMLRequest asincrono per registrare errori in Fogbugz nei nostri siti ASP. Poiché è solo un rapporto di errore, non vogliamo che i nostri utenti restino in attesa che il nostro codice finisca, quindi lo facciamo asincrono. Questo potrebbe essere per qualsiasi cosa da un file di configurazione mancante, timeout del DB, ricerca mancante in un file di configurazione da qualche parte, ecc. Non sempre roba da missione, ma buona da sapere. In questi casi l'asincrono funziona bene e se non lo è non è la fine del mondo per noi, ma non abbiamo avuto alcun problema. Abbiamo utilizzato questo script che creiamo e pubblicato in un'altra domanda:

System.Net.HttpWebRequest in classic asp?

come Anthony dice se la sua non al 100% guanenteed per farlo passare. Come possibile correzione è possibile impostare Response.Buffer = true, eseguire il rendering di tutti i risultati per l'utente, chiamare Response.Flush e quindi eseguire una chiamata waitForResponse. L'utente vedrà l'intera pagina e sarà in grado di interagire con esso senza alcun ritocco e darà alla tua chiamata asincrona un po 'più di tempo per finire.

12

Oggi ho avuto lo stesso problema. L'ho risolto usando l'oggetto "Microsoft.XMLHTTP".

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

E ora la richiesta viene inviata in modo asincrono e l'URL di destinazione è stato colpito. Spero che questo aiuti.

+0

eccellente - grazie! – EdenMachine

+0

Mi hai appena salvato dalla morte picchiando la testa contro la tastiera. Questo sembra essere un rimpiazzo diretto (non è necessario alcun refactoring?) Per "MSXML2.ServerXMLHTTP", ma eseguirò le regressioni solo per essere sicuro. – jerhewet

2

Un'altra opzione se si desidera comunque utilizzare l'oggetto ServerXMLHTTP (e non il componente lato client sopra indicato da Anton vedere le domande frequenti 4 al http://support.microsoft.com/kb/290761) è creare una classe VBScript. Istanziare la classe. Impostare una proprietà della classe sull'oggetto HTTP. Quindi chiama un metodo per attivare la richiesta.

Non distruggere mai l'istanza della classe: verrà automaticamente distrutta al termine della pagina ASP. Avere il metodo di distruzione della classe libera l'oggetto HTTP - che dovrebbe dare abbastanza tempo per sparare la richiesta prima che venga distrutta.

Problemi correlati