Pourquoi est-ce web api contrôleur ne sont pas simultanées?
J'ai une Web API Contrôleur avec la méthode suivante à l'intérieur:
public string Tester()
{
Thread.Sleep(2000);
return "OK";
}
Quand je l'appelle 10 fois (à l'Aide de Fiddler), j'attends de tous les 10 appels de retour après ~ 2 secondes. Toutefois, les appels de retour après 2,4,8...20 secondes, respectivement.
Qu'est-ce que le blocage de s'exécuter en même temps? Comment puis-je régler ce problème?
Faire régulièrement des Contrôleurs ont le même comportement que web-api contrôleurs?
Je vais aller de l'avant et suppose que vous utilisez un ApiController dans un MVC.NET projet, parce que si ce n'est pas le cas, vous ne devriez pas être confronté à ce que vous décrivez, sauf peut-être si vous êtes explicitement l'accès à certains "le blocage de la ressource". Veuillez mettre à jour votre question d'inclure certaines informations qui précise, et regarder @Badri réponse.
OriginalL'auteur Elad Katz | 2014-11-04
Vous devez vous connecter pour publier un commentaire.
Ce que vous décrivez correspond au comportement par défaut de la ASP.NET l'État de Session et peut être résolu par la désactivation de dans web.config.
Source: ASP.NET vue d'ensemble de l'État de Session
OriginalL'auteur sisve
Je ne pense pas que je vais répondre à votre question, mais ce que je voudrais écrire ici est trop grand pour un commentaire.
D'abord, ASP.NET l'API Web n'a rien à voir avec l'état de la session. En fait, si la session doit être utilisé avec l'API web, alors il doit être explicitement activé.
Maintenant, j'ai exactement la même API contrôleur comme vous et moi hôte dans IIS. Si je fais des demandes simultanées, il est en cours d'exécution les demandes en parallèle et non en série. Voici comment je l'ai testé à partir de la Fiddler.
Tout d'abord, j'ai fait une OBTENIR de l'API et attendu pour le code d'état 200 (#1 dans un violon volet de gauche). Ensuite, j'ai choisi #1 et pressé U pour rejouer la même demande sans condition 9 fois. Avec qui j'ai 10 demandes dans le volet de gauche (#1 à #10). Ensuite, j'ai sélectionné les 10 et appuyé sur R de la remplacer tous les dix demandes en parallèle. J'ai ensuite sélectionné les demandes de 11 à 20 ans dans le volet de gauche, puis est allé à l'onglet plan chronologique. Je vois ce graphique.
PS. J'ai testé l'API web s'exécutant localement, BTW.
Prochaine, je voulais journal de l'horodatage demande reçue par la méthode de l'action. Donc, j'ai modifié la méthode d'action pour renvoyer une chaîne comme celle-ci.
J'ai eu la suivante.
Pour moi, cela signifie, à toutes les demandes sont en cours d'exécution en parallèle.
Son ok que l'api web n'est pas liée à la session et vous êtes à expérimenter avec aucun mode de session . Pouvez-vous tester vos scénarios lorsque les sessions sont activés . Vous devez alors obtenir les demandes en séquence plutôt qu'en parallèle.Pouvez-vous merci de confirmer que
OriginalL'auteur Badri
Pencher sur cette question, qui est relatif à votre problème:
Sont toutes les requêtes web exécutés en parallèle et manipulés de façon asynchrone?
Elle affirme que:
Pour résoudre ce problème, vous pouvez utiliser les méthodes asynchrones, comme décrit ici.
En général, vous devez déclarer votre méthode async, comme ceci:
Tu veux dire un contrôleur MVC? Oui. Lire la suite ici weblogs.asp.net/imranbaloch/concurrent-requests-in-asp-net-mvc
faire les différents contrôleurs de bloquer les uns les autres? (si je comprends bien, à partir de l'article)
Ce n'est pas une question de si vous utilisez un Contrôleur ou un ApiController, mais plutôt une question de savoir si vous (peut-être) essayez d'accéder à un "blocage de la ressource" ou pas. Si vous ne pouvez vous rendre à la ressource "non bloquant" (comme dans le cas de la ASP.NET l'État de Session, voir la "lecture-seule" partie de Simon Svensson la réponse de), vous pouvez aller pour la
async
option (ou une autre technique de parallélisation) comme suggéré.La déclaration de Mark cite dans sa réponse n'est pas tout à fait exact, car il ne s'applique pas à une réelle WebApi-solution (par opposition lors de l'utilisation d'un ApiController au sein d'une MVC.NET la solution). Avoir celui marqué comme "correct" peut induire en erreur les gens (surtout parce que la question manque un peu d'information de fond) en leur faisant croire que la WebApi est nécessairement dépendante de l'état de session par défaut - ce qui n'est évidemment pas. Voir aussi la réponse de @Badri.
OriginalL'auteur Mark Segal
Essayez d'utiliser ceci à la place:
Le voir pour savoir la différence entre la Tâche.Retard vs Thread.Le sommeil qui bloque http://social.technet.microsoft.com/wiki/contents/articles/21177.visual-c-thread-sleep-vs-task-delay.aspx
Si vous n'utilisez pas la version asynchrone de l'méthodes, alors oui.
Ce n'est pas grave, les requêtes web sont dans des threads séparés. C'est un type spécial de blocage fait par quelque chose comme la
lock
mot-clé qui est destiné à être utilisé dans tous les processus enfants pour n'importe quelle application.OriginalL'auteur Omar.Alani
Vous devez avoir activé le
Session State
quelque part pour les Api Web. Web API restful par défaut et n'a pas de session. Vérifiez votre global.asax Application_AuthenticateRequest section (c'est là que j'ai activer l'état de session pour le Web Api). Trouver où vous avez activé votre état de session et le régler en mode lecture seule pour permettre le parallélisme sur le web à l'aide de méthodes de l'état de session. Voir cette question qui est similaire: L'API Web Service - Comment faire la demande au serveur pour être exécutées simultanémentChercher quelque chose comme ceci:
Changer à cela:
OriginalL'auteur Timothy Gonzalez