Déchiffrage des erreurs NullReferenceException ou de cycle de référence de liaison dans Windows Phone 7.1

Article d’origine publié le dimanche 15 janvier 2012

J’ai récemment rencontré un problème extrêmement difficile à diagnostiquer et à corriger, et comme mes recherches ne m’ont permis de trouver aucune information à ce sujet, j’ai décidé d’en parler ici au cas où quelqu’un d’autre le rencontrerait à son tour. Dans une application Windows Phone 7.1 (par ex : Mango), vous avez une référence de service - dans mon cas une application WCF. Ce que j’observais assez fréquemment mais de manière totalement aléatoire, est qu’elle déclenchait une exception lors de la création du proxy WCF. Ce que je veux dire par là est que cette ligne de code :

MyService.MyClass foo = new MyService.MyClass("myConfigSettings");

déclenchait une exception. Si cela est en soi assez incompréhensible, ce qui était encore plus intrigant et énervant est que l’exception déclenchée n’était pas toujours la même, mais l’une ou l’autre suivante, sans aucun début d’explication :

  • NullReferenceException - aucun détail, aucun message, aucune exception interne, rien.
  • Un cycle de référence de liaison a été détecté dans votre configuration. Le cycle de référence suivant doit être supprimé : basicHttpBinding/BasicHttpBinding_IMyAppInterface

L’un des (nombreux) trucs les plus dingues est que l’exception n’était déclenchée que lorsque la méthode était appelée depuis un bout de code exécuté pendant le démarrage de l’application ; appelez la méthode à n’importe quel autre moment et il n’y avait aucun problème. En plus, si vous passiez pas à pas à travers le code de gestion des exceptions, puis remontiez la ligne d’exécution suivante en la faisant glisser pour créer l’instance de proxy, ça marchait toujours. D’autres méthodes un peu improbables produisaient aussi des résultats plus ou moins heureux, mais ce qui a fini par me mettre la puce à l’oreille était le fait qu’il y avait dans le code de démarrage de l’application un autre bout de code qui s’exécutait et créait également une instance de ce proxy WCF mais qui n’échouait JAMAIS. Ainsi, en essayant de deviner pourquoi un marchait toujours quand l’autre se plantait souvent, j’ai fini par m’intéresser à la manière avec laquelle le code était appelé. Au bout du compte, j’avais deux threads d’arrière-plan différents qui étaient créés, et chacun exécutait un bout de code différent. Chaque thread appelait des méthodes différentes qui contenaient du code d’instanciation d’une instance du proxy WCF. Et c’est cela qui était à l’origine du problème. En reconfigurant le code de sorte que toutes les tâches de démarrage de l’application s’exécutent sur un seul thread d’arrière-plan, les exceptions bizarres ont disparu comme par enchantement...

Comme il m’a fallu un vrai coup de chance (et pas mal de tâtonnements et de ratages) pour résoudre cette affaire, je me suis dit que ce serait une bonne idée de vous en faire part.

Ceci est une version localisée d’un article de blog. Vous trouverez la version originale de l’article sur Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1