7
votes

Comment puis-je déclencher un appel asynchrone dans ASP Classic et ignorer la réponse?

Voici le gist:

J'ai un appel que je veux faire dans ASP, et je ne me soucie pas de la réponse. Je veux juste voler l'appel et je ne veux pas que la page attendait la réponse. Selon la documentation, il devrait ressembler à quelque chose comme ceci: p> xxx pré>

Ceci fonctionne à la pêche lors de l'appel de manière synchrone, mais lorsque je retourne l'option ansynchrone à "vrai", rien ne tire. Ce que je peux rassembler sur Internet, c'est que les utilisateurs font quelque chose comme ce qui suit: P>

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


0 commentaires

4 Réponses :


7
votes

Le problème de la clé ici est si vous n'attendez pas et votre script termine que le composant ServerXMLHTTP détruit lui-même et dans le processus aborde la demande en suspens. Il n'y a aucun moyen pour vous de garantir où la demande doit à cette époque.

Par exemple, si votre serveur n'a pas été rond pour émettre au serveur de destination, il ne verra plus que ce n'est plus nécessaire et ne pas déranger.

Même si une connexion a été faite sur le serveur de destination, la demande n'a pas encore été donnée à un gestionnaire. Souvent, un serveur Web vérifiera que le client est toujours connecté avant de commettre des ressources pour remplir une demande. S'il voit que votre connexion a été supprimée, cela ne vous dérangera pas de remplir la demande.

En d'autres termes, il n'y a pas de moyen fiable d'effectuer cette opération de manière asychronnée dans l'ASP classique, il n'est tout simplement pas conçu pour gérer ce genre de chose. Le mieux que vous puissiez obtenir est de faire d'autres choses pendant que votre script contient quelque chose d'autre (si vous avez quelque chose d'autre chose à continuer), je ne recommanderais même pas que, puisque WinHTTP asynchrone à l'intérieur de Asp est flaky.


0 commentaires

3
votes

Nous utilisons ASYNC XMLrequest pour enregistrer des erreurs dans Fogbugz dans nos sites ASP. Comme son seul rapport d'erreur, nous ne voulons pas que nos utilisateurs accrochent à attendre que notre code soit terminé afin de le faire asynchroniser. Cela pourrait être pour quoi que ce soit à partir d'un fichier de configuration manquant, de DB Timeout, de la recherche manquante dans un fichier de configuration quelque part, etc. Pas toujours des choses crytiques de mission mais bon à connaître. Dans ces cas, l'Async travaille un régal et, sinon, ce n'est pas la fin du monde pour nous, mais nous n'avons eu aucun problème avec cela. Nous utilisons ce script que nous créons et posté dans une autre question:

System.net.httpwebrequest à Classic Asp?

Comme Anthony dit que ce n'est pas à 100% de Guanented de traverser. En tant que solution possible, vous pouvez Sert Response.buffer = true, rendez toute votre sortie à l'utilisateur, appelez la réponse.flush et ensuite faire un appel de serviresponse. L'utilisateur verra toute la page et être capable d'interagir avec elle sans aucune maintien et donne à votre async appel un peu plus de temps pour terminer.


0 commentaires

13
votes

Aujourd'hui, j'ai eu le même problème. Je l'ai résolu en utilisant l'objet "Microsoft.XMLLHTTP".

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


1 commentaires

Vous venez de m'avoir sauvé de la mort en battant la tête contre le clavier. Cela semble être un remplacement direct (aucune refactorisation nécessaire?) Pour "MSXML2.SERVERXMLHTTP" - mais je vais courir des régressions pour vous assurer.



2
votes

Une autre option si vous souhaitez toujours utiliser l'objet ServerXMLHTTP (et non le composant côté client mentionné ci-dessus par Anton, voir FAQ # 4 à http://support.microsoft.com/kb/290761 ) est de créer une classe VBScript. Instancier la classe. Définissez une propriété de la classe sur l'objet HTTP. Appelez ensuite une méthode pour tirer la demande.

Ne détruisez jamais l'instance de classe - elle sera automatiquement détruite lorsque la page ASP se termine. Demandez à la méthode de destruction de la classe libérer l'objet HTTP - qui devrait lui donner suffisamment de temps pour tirer de la demande avant qu'elle ne soit détruite.


0 commentaires