2009-10-02 13 views
7

Oto sedno:Jak wywołać asynchroniczne wywołanie w asp classic i zignorować odpowiedź?

Mam połączenie, które chcę wykonać w bolenie, i nie dbam o odpowiedź. Chcę tylko wystrzelić połączenie i nie chcę, aby strona czekała na odpowiedź. Zgodnie z dokumentacją, powinno to wyglądać mniej więcej tak:

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 

Działa to aksamitny Dzwoniąc synchronicznie, ale kiedy przerzucić ansynchronous opcję „true”, pożary nic. Co mogę zebrać z Internetu jest to, że użytkownicy zrobić coś jak następuje:

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

jestem szalona, ​​że ​​to naprawdę nie wydawać się asynchrous rozmowy już jednak, jeśli czekasz na odpowiedź?

umieszczenie linii xmlhttp.waitForResponse 1 tuż po wysłaniu spowoduje wysłanie żądania, ale znowu, nie chcę czekać na sekundę.

Jakieś myśli?

Odpowiedz

7

Kluczowym problemem jest to, że jeśli nie zaczekasz, a skrypt się zakończy, komponent ServerXMLHTTP zostanie zniszczony, a proces anuluje zaległe żądanie. Nie ma sposobu, aby zagwarantować, gdzie wniosek dotarł w tym czasie.

Na przykład, jeśli serwer nie został wysłany do serwera docelowego, zobaczy, że nie jest już potrzebny i nie zawraca sobie głowy.

Nawet jeśli zostało nawiązywane połączenie z serwerem docelowym, żądanie może nie zostać przekazane do obsługi. Często serwer sieciowy sprawdza, czy klient jest nadal podłączony, zanim zaangażuje zasoby do realizacji żądania. Jeśli zauważy, że twoje połączenie zostało usunięte, nie będzie zawracać sobie głowy wypełnianiem wniosku.

Innymi słowy, nie ma niezawodnego sposobu wykonania tej operacji asakronicznie w klasycznej ASP, po prostu nie jest przeznaczony do obsługi tego typu rzeczy. Najlepsze co możesz zrobić, to robić inne rzeczy, podczas gdy twój skrypt radzi sobie z czymś innym (jeśli masz cokolwiek innego, z czym można się dogadać), jednak nie polecałbym tego, ponieważ asynchroniczny WinHTTP wewnątrz ASP jest niestabilny.

3

Używamy async XMLRequest do rejestrowania błędów w Fogbugz w naszych witrynach ASP. Jako jedyny raport o błędzie nie chcemy, aby nasi użytkownicy kręcili się czekając na zakończenie naszego kodu, więc robimy to asynchronicznie. Może to dotyczyć dowolnego elementu z brakującego pliku konfiguracyjnego, limitu czasu bazy danych, braku wyszukiwania w pliku konfiguracyjnym, itp. Nie zawsze jest to misja o charakterze kryptograficznym, ale o której warto wiedzieć. W tych przypadkach asynchronizm jest dla nas przyjemnością, a jeśli nie, to nie jest dla nas końcem świata, ale nie mieliśmy z tym żadnych problemów. Byliśmy przy użyciu tego skryptu, które tworzymy i zamieszczonych w innym pytaniem:

System.Net.HttpWebRequest in classic asp?

Jak mówi Anthony choć jej nie 100% guanenteed aby dotrzeć. Jako możliwą poprawkę możesz sertować Response.Buffer = true, wyrenderować wszystkie dane wyjściowe do użytkownika, wywołać Response.Flush, a następnie wykonać wywołanie waitForResponse. Użytkownik zobaczy całą stronę i będzie w stanie wchodzić z nią w interakcję bez żadnego wstrzymania, a twoje połączenie asynchroniczne da trochę więcej czasu na zakończenie.

12

Dziś mam ten sam problem. Rozwiązałem problem za pomocą obiektu "Microsoft.XMLHTTP".

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

A teraz prośba zostanie wysłane asynchronicznie i docelowy adres URL został trafiony. Nadzieję, że pomaga.

+0

doskonały - dziękuję! – EdenMachine

+0

Właśnie uratowałeś mnie przed śmiercią, uderzając głową w klawiaturę. To wydaje się być bezpośrednim zamiennikiem (bez konieczności refaktoryzacji?) Dla "MSXML2.ServerXMLHTTP" - ale będę uruchamiał regresje tylko po to, aby się upewnić. – jerhewet

2

Inną opcją, jeśli nadal chcesz używać obiektu ServerXMLHTTP (a nie komponentu po stronie klienta wspomnianego powyżej przez Anton patrz FAQ # 4 pod numerem http://support.microsoft.com/kb/290761) jest utworzenie klasy VBScript. Wywołaj klasę. Ustaw właściwość klasy na obiekt HTTP. Następnie wywołaj metodę odpalania żądania.

Nie niszczyć instancji klasy - zostanie ona automatycznie zniszczona po zakończeniu działania strony ASP. Niech metoda niszczenia klas zwolni obiekt HTTP - to powinno dać mu wystarczająco dużo czasu, aby wystrzelić żądanie, zanim zostanie zniszczone.

Powiązane problemy