Timeout WCF au bout d’un certain nombre d’appels

Rien de plus stressant que de passer une journée entière sur un bug. Surtout si on n’a aucune idée du problème (pas d’exceptions, ni d’erreurs dans les logs) et que les recherches sur Internet sont infructueuses.
Contexte : une application Web Asp.Net communique avec un service WCF.
Problème : au bout d’un certain nombre d’appels (invariant) l’application Web n’arrive plus à joindre le serveur (Timeout).

Pour conserver une trace de mon incompétence, voici donc la solution:
Pour qu’on puisse dialoguer avec un service WCF dans une page Asp.net, je leur injecte un proxy à l’aide de Spring (voir Spring.net pour le web). Pour cela, j’utilise une « factory de proxy » à l’aide de l’interface IFactoryObject.
Crédule que j’étais, j’imaginais que le fait de retourner true pour la propriété IsSingleton allait faire en sorte que Spring.net ne fasse appel qu’une seule fois à la méthode GetObject().
Et bien non ! C’est à vous d’être cohérent: même si IsSingleton retourne true, rien ne vous empêche de toujours retourner une instance différente dans la méthode GetObject().

Pour en revenir à mon problème, vous l’aurez compris : ma méthode GetObject() retournait à chaque fois un nouveau proxy vers le service WCF.
Résulat : à chaque fois que Spring avait besoin d’injecter mon proxy à une page (postback par exemple), je créai une nouvelle connexion au serveur WCF. J’ai fini par atteindre le nombre de connexion max, et le serveur ne répondait plus.

Il est tout de même dommage que les traces WCF ne m’ont pas révélé d’exception expliquant cette limite max de connexion 😦

Pour approfondir le sujet sur les IFactoryObject :
Un objet qui implémente IFactoryObject doit toujours être un singleton, si ce n’est pas le cas on obtient une exception:

<object id="maFactory" type="MonAssembly.MaFactory, MonAssembly" singleton="false"/>


=> IFactoryObject must be defined as a singleton - IFactoryObjects themselves are not allowed to be prototypes.

La propriété IsSingleton de la factory indique seulement ce qu’elle est censée faire… mais sans aucune obligation/vérification du comportement. Dans mon cas, je retournais true mais rien ne m’a empêché de créer une nouvelle instance à chaque appel…

Dans le cas particulier d’une application Asp.net, on peut avoir des « presque singleton » en changeant le scope:

<object id="maFactory" type="MonAssembly.MaFactory, MonAssembly" scope="application"/>
  • scope= »application » : c’est un singleton de toute l’application web. Firefox et Safari m’affiche toujours 1.
  • scope= »session » : c’est un singleton pour chaque session cliente. Firefox et Safari m’affiche toujours 2 (1 instance pour Firefox + 1 instance pour Safari).
  • scope= »request » : c’est un singleton dans le cadre de la requête. Firefox et Safari vois le compteur s’incrémenter à chaque rafraichissement de la page.

Pour plus d’infos sur les scopes.

Conclusion(s) :

  1. Ce n’est pas la propriété IsSingleton qui détermine si Spring va faire appelle une ou plusieurs fois à votre Factory. C’est à elle de fournir le comportement adéquat.
  2. Un singleton n’en est pas toujours un… ça dépend du contexte. Dans tous les cas, pour éviter les erreurs comme la mienne, n’oublier pas d’utiliser la destroyMethod pour libérer les ressources. (l’interface ILifeCycle de Java n’existe pas encore dans Spring.net mais la 1.2 sort en RC1 début mai…).
  3. Un « Timeout » peut vouloir dire « trop de connexion au serveur » 🙂
  4. Cette fameuse Factory de proxy WCF sera fournie dans Spring.net 1.2. j’aurais perdu moins de temps en prenant les sources des nightbuilds… vive l’OpenSource!
Publicités

Une réflexion sur “Timeout WCF au bout d’un certain nombre d’appels

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s