2010-02-13 6 views
0

Le problème est le suivant: Un serveur externe envoie des messages SMS entrants convertis en requêtes HTTP dans ma page .aspx parfois très consommatrice de temps. Si aucune réponse n'est renvoyée au serveur externe en 20 secondes, cela est considéré comme un délai d'attente et le même message est envoyé à ma page ASPX (et peut-être encore ....)ASP.NET, appel asynchrone vers une autre page, réponse immédiatement

La solution optimale pour moi serait que la page aspx lit le message entrant (en tant que requête HTTP à la page aspx), démarre le traitement du message dans un autre thread, et restitue immédiatement la réponse au serveur externe. Le serveur externe n'a aucun intérêt dans d'autres choses que le statut HTTP (normalement 200). Lorsque le traitement du message est terminé, cela entraîne une entrée dans le fichier journal de l'application. Le traitement du message se fait en faisant une autre requête web à une page aspx, et j'ai essayé d'utiliser la méthode BeginGetResponse pour la requête web, et j'ai créé un gestionnaire pour le traitement de la requête web terminée pour le traitement page. Le problème est que le gestionnaire ne semble pas être appelé, probablement parce que le cycle de vie de la page ASPX est terminé avant que la requête Web asynchrone soit terminée.

Quelqu'un at-il une bonne solution à ce problème? J'ai également regardé le modèle de page asynchrone, mais cela ne semble pas non plus être une solution pour moi parce que la réponse devrait être renvoyée au serveur externe avant que le traitement du message soit terminé.

Cordialement, Eivind

Répondre

1

Je serais très prudent d'utiliser des fils dans ASP.Net de cette manière. Les utiliser pour tirer parti de plusieurs cœurs est une chose. Les utiliser pour mettre en place une sorte de technique de réponse simultanée semble être une recette pour un désastre. Surtout quand il y a une solution beaucoup plus élégante.

Votre application ASP.Net devrait simplement prendre le message et l'envoyer dans une base de données et envoyer la réponse de succès. C'est un travail fait. Le travail de livraison du message devrait être géré par une sorte de service ou démon. Les services Windows sont un peu difficiles à créer et à gérer. Il se peut donc qu'une tâche planifiée qui s'exécute toutes les 30 secondes ou presque vérifie si les messages mis en file d'attente dans la base de données répondent parfaitement à vos besoins.

J'ai vu beaucoup de gens essayer d'utiliser des threads dans ASP.Net alors qu'ils devraient simplement créer un service d'arrière-plan. Les résultats ne sont jamais aussi fiables que vous le souhaiteriez.

+0

Merci pour la réponse. J'espérais une solution qui pourrait être implémentée dans la page ASPX elle-même, mais le dumping du message entrant dans la base de données et l'utilisation d'un service pour l'interrogation de nouveaux messages semble être une solution robuste –

0

Le modèle de page asynchrone n'est certainement pas la solution. Avez-vous essayé d'utiliser l'événement unload pour faire EndRequest? Je ne sais vraiment pas si cela fonctionnerait mais ça vaut le coup d'essayer. La méthode la plus robuste consiste à utiliser le service Windows pour exécuter la requête asynchrone.

+0

Salut, merci pour la réponse. Je ne suis pas sûr si je comprends votre suggestion, voulez-vous dire que je devrais mettre un appel à une méthode EndRequest dans le gestionnaire d'événements _Unload? Ce que je veux vraiment accomplir, c'est que la réponse se termine, et renvoie HTTP 200 OK au serveur demandeur immédiatement après le début du traitement –

+0

oui c'est ce que je suggère. La réponse se termine après l'appel de la méthode Render, alors Page_Unload est exécuté après la fin de la réponse. – Stilgar

Questions connexes