2013-06-25 5 views
0

J'ai un .NET 3.5 BasicHttpBinding aucun service de sécurité WCF hébergé sur IIS 6.0.wcf opération expire sans erreur

J'ai l'étranglement de service bumped selon les recommandations MS.

Mon opération de service est appelée plusieurs centaines de fois de manière concomitante, et à un moment donné, le client obtient une exception de délai d'attente (59:00, c'est ce qui est défini dans le serveur et les délais d'attente client).

Si j'augmente le délai d'expiration, la nouvelle limite est atteinte.

Il semble que l'application se "fige" quelque part et nous n'avons pas été en mesure de comprendre comment cela se produit.

Le suivi WCF côté serveur n'a rien trouvé.

Des idées concernant ce qui pourrait être le problème?

Merci

+0

dans des délais d'attente WCF peut être le signe d'un problème dans le service (généralement une exception non gérée de quelque sorte). Vous mentionnez que cela est hébergé dans IIS - savez-vous si les clients ferment leurs chaînes quand ils ont terminé? Si ce n'est pas le cas, cela pourrait aussi être la source du problème, car vous pouvez rencontrer des contraintes de ressources avec des clients qui sont laissés pour "mourir d'une mort naturelle", pour ainsi dire. – Tim

+0

Vous mentionnez des centaines de demandes simultanées, mais cela fonctionne-t-il pour une seule requête? Veuillez également vérifier les journaux d'événements sur le serveur, il peut y avoir une erreur système ou quelque chose. – Anu

+0

Fermez-vous correctement vos chaînes? Nous avons rencontré un problème similaire et découvert que certaines opérations du côté client ne fermaient pas leur IClientChannel, ce qui entraînait beaucoup de canaux ouverts, ce qui a empêché le serveur d'accepter de nouvelles connexions. – Jobo

Répondre

0

Je suppose que votre WebService n'utilise pas la nouvelle async/vous attendent en particulier les appels par rapport'a la base de données. Dans ce cas, c'est parce que vous bloquez vos threads limités.

Plus en détail. IIS/ASP.net crée uniquement un nombre limité de threads pour gérer les demandes. Le premier ... disons que 8 demandes lancent des discussions et commencent à travailler. À un moment donné, ils vont frapper la base de données (je suppose une application traditionnelle n-tier). Ces threads dorment. Le prochain dis ... 992 demandes ont frappé IIS et sont maintenues dans une file d'attente.

À un certain point, les appels de base de données retournent, traitent des données ... envoient des données au client. 8 autres requêtes sont supprimées ... appuyez sur la base de données ... etc ...

Cependant chaque jeu de 8 requêtes prend un temps fini à compléter. Avec plus de 900 requêtes devant eux, les 100 derniers threads prendront au moins 100 * latency * nombre de roundtrips avant de pouvoir démarrer. Si votre temps de latence * est élevé ... votre dernière requête prendra beaucoup de temps avant même qu'elle ne soit retirée, d'où le timeout.

Deux remèdes existent. Le premier, créer plus de threads .... utilisera toute votre mémoire et vos plantages IIS. La seconde est d'utiliser .net 4.5 et async/await.

See here for more information