2009-10-02 6 views
7

Hier ist das Wesentliche:Wie feuere ich einen asynchronen Aufruf in asp classic und ignoriere die Antwort?

Ich habe einen Anruf, den ich in asp machen möchte, und ich interessiere mich nicht für die Antwort. Ich möchte nur den Anruf tätigen und möchte nicht, dass die Seite auf die Antwort wartet. Gemäß der Dokumentation, sollte es in etwa so aussehen:

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 

Diese peachy funktioniert, wenn synchron aufrufen, aber wenn ich die ansynchronous Option auf ‚true‘, nichts Feuer kippen. Was ich aus dem Internet sammeln kann, ist, dass die Benutzer etwas tun, wie folgt aus:

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

Bin ich verrückt, dass dies wirklich nicht wie ein asynchrous Anruf scheinen mehr, obwohl, wenn Sie auf eine Antwort warten?

setzen Sie die Linie xmlhttp.waitForResponse 1 direkt nach dem Senden wird die Anfrage zu feuern, aber wieder möchte ich nicht eine Sekunde warten.

Irgendwelche Gedanken?

Antwort

7

Das Hauptproblem hier ist, wenn Sie nicht warten und Ihr Skript endet die ServerXMLHTTP Komponente zerstört sich selbst und im Prozess bricht die ausstehende Anfrage ab. Es gibt keine Möglichkeit für Sie zu garantieren, wo die Anfrage zu diesem Zeitpunkt angekommen ist.

Zum Beispiel, wenn Ihr Server nicht rund um Ausgabe an den Zielserver hat, wird es sehen, dass es nicht mehr benötigt wird und nicht stören.

Auch wenn eine Verbindung zum Zielserver besteht, wurde die Anfrage möglicherweise noch nicht an einen Handler gesendet. Oft prüft ein Webserver, ob der Client noch verbunden ist, bevor er Ressourcen zur Erfüllung einer Anfrage bindet. Wenn die Verbindung getrennt wird, wird die Anfrage nicht bearbeitet.

Mit anderen Worten, es gibt keine zuverlässige Möglichkeit, diese Operation asynchron im klassischen ASP durchzuführen, es ist einfach nicht dafür ausgelegt, damit umzugehen. Das Beste, was Sie bekommen können, ist, andere Dinge zu tun, während Ihr Skript mit etwas anderem fertig wird (wenn Sie noch etwas anderes zu tun haben), würde ich nicht einmal empfehlen, da asynchrones WinHTTP in ASP flockig ist.

3

Wir verwenden async XMLRequest, um Fehler in Fogbugz in unseren ASP-Sites zu protokollieren. Da es sich nur um einen Fehlerbericht handelt, möchten wir nicht, dass unsere Benutzer herumhängen und darauf warten, dass unser Code beendet wird, also tun wir es asynchron. Dies kann für alles sein, von einer fehlenden Konfigurationsdatei, einem DB-Timeout, fehlender Suche in einer Konfigurationsdatei, etc. Nicht immer missionarisches Zeug, aber gut zu wissen. In diesen Fällen funktioniert das Async ein Vergnügen und wenn nicht, dann ist es nicht das Ende der Welt für uns, aber wir hatten keine Probleme damit. Wir haben dieses Skript wurde verwendet, die wir erstellen und in einer anderen Frage gestellt:

System.Net.HttpWebRequest in classic asp?

Wie Anthony sagt, obwohl es nicht 100% guanenteed durchzukommen. Als mögliche Lösung könnten Sie Response.Buffer = true setzen, all Ihre Ausgabe an den Benutzer rendern, Response.Flush aufrufen und dann einen waitForResponse-Aufruf ausführen. Der Benutzer wird die ganze Seite sehen und in der Lage sein, ohne Halt mit ihr zu interagieren, und es gibt Ihrem Async-Anruf ein bisschen mehr Zeit zum Beenden.

12

Heute habe ich das gleiche Problem. Ich löste es mit dem Objekt "Microsoft.XMLHTTP".

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

Und jetzt die Anfrage wird asynchron gesendet und Ziel-URL wurde getroffen. Hoffe, dass hilft.

+0

ausgezeichnet - danke! – EdenMachine

+0

Sie haben mich gerade vor dem Tod gerettet, indem Sie Ihren Kopf gegen die Tastatur stampfen. Dies scheint ein direkter Ersatz (kein Refactoring notwendig?) Für "MSXML2.ServerXMLHTTP" zu sein - aber ich werde Regressionen ausführen, nur um sicherzugehen. – jerhewet

2

Eine weitere Option, wenn Sie das ServerXMLHTTP-Objekt (und nicht die oben erwähnte clientseitige Komponente von Anton siehe FAQ # 4 unter http://support.microsoft.com/kb/290761) verwenden möchten, ist das Erstellen einer VBScript-Klasse. Instanziieren Sie die Klasse. Setzen Sie eine Eigenschaft der Klasse auf das HTTP-Objekt. Rufen Sie dann eine Methode zum Absetzen der Anfrage auf.

Zerstören Sie niemals die Klasseninstanz - sie wird automatisch zerstört, wenn die ASP-Seite beendet wird. Lassen Sie die Klassenzerstörungsmethode das HTTP-Objekt frei - das sollte genügend Zeit haben, die Anfrage abzubrechen, bevor sie zerstört wird.