2010-05-19 4 views
0

Je reçois un comportement bizarre dans asp.net MVC2 (au moins ce n'est pas ce que j'attends). J'ai une action httppost du contrôleur qui traite les cartes de crédit. Je mets une variable de session sur le serveur pour me faire savoir si un utilisateur a essayé de traiter une carte. J'efface cette variable de session quand j'ai fini. Je fais des messages très rapides pour tester le processus et la variable de session revient à zéro à chaque fois parce que j'efface la variable de session à la fin du processus. J'ai quelques impressions de débogage qui me montrent que toutes les demandes sont traitées de manière synchrone. C'est ... la première tentative se produit, elle échoue, la variable de session est effacée, la deuxième tentative essaye et échoue et la variable est effacée, etc ... Ma première pensée était que c'était un effet secondaire du débogage et qu'il venait juste d'être aligné demande à des fins de débogage à l'aide du serveur Web local. Donc, je l'ai mis sur un serveur de développement et la même chose se produit. Plusieurs soumissions/messages sont traités de manière synchrone. Je mets même un System.Threading.Sleep dedans pour m'assurer qu'il s'arrêtera juste après que j'ai placé la variable de session et il ne commencera même pas la deuxième demande START jusqu'à ce que le premier soit fait.asp.net mvc 2 multithread

Est-ce que quelqu'un d'autre a vu ce comportement? Ma compréhension était qu'un processus de travail a été engendré pour chaque demande et que ces actions pourraient se produire de manière asynchrone.

Voici quelques pseudo-code

if (Session["CardCharged"] != null) 
    return RedirectToAction("Index", "Problem"); 
Session["CardCharged"] = false; //starting the process 
System.Threading.Thread.Sleep(10000); 
//charge card here 

if (!providerResponse.IsApproved) 
{ 
    System.Diagnostics.Debug.WriteLine("failed"); 
    Session["CardCharged"] = null; //have to allow them to charge again since this failed 
    return View(myModel); 
} 

Session["CardCharged"] = true; 
return RedirectToAction("Index", "OrderComplete"); 

Je dois mentionner que mon code échoue toujours le chèque de carte de crédit à des fins de test. J'essaie de tester la situation où le traitement est toujours en cours et rediriger l'utilisateur ailleurs. J'ai placé une variable de session fictive ailleurs pour m'assurer que l'identifiant de session «colle». Je sais donc que l'identifiant de session est le même pour chaque requête.

Merci

+0

Comment générez-vous les demandes de test? Est-il possible qu'ils soient faits de manière synchrone? – joelt

+0

Je clique rapidement sur Soumettre ou actualiser la page. Comme il y a un thread slero après avoir défini la variable, cela ne devrait pas avoir d'importance. La prochaine demande devrait être vérifiée et redirigée. Mais la demande ne commence même pas jusqu'à ce que l'autre soit fait. –

+0

Je pense qu'il peut s'agir d'un problème de demande unique par session. Au moins en ASP classique, il y a une telle limite. – svinto

Répondre

0

Ceci est une limitation avec le navigateur n'envoyer une requête POST à ​​un moment et faire la queue les autres demandes. Ce n'est pas une limitation avec le serveur web. Une façon de simuler plusieurs requêtes consiste à utiliser un outil tel que tinyget qui fait partie de la boîte à outils IIS 6.0. Pour votre test, vous devrez utiliser l'option multi-threads.

Espérons que cela aide.

+0

Cela a du sens, mais ... J'ai également essayé d'envoyer à partir de deux instances de navigateur différentes. Je sais que vous pourriez vouloir dire que c'est probablement deux identifiants de session différents, mais ce n'est pas le cas. J'ai vérifié et les identifiants de session sont les mêmes. J'ai toujours reçu le comportement dont je parlais. Je vais essayer tinyget. –