Vous surchargez la pile TCP/IP. Windows (et je pense que toutes les piles de sockets en fait) ont une limitation sur le nombre de sockets qui peuvent être ouverts en séquence rapide en raison de la façon dont les sockets sont fermés en fonctionnement normal. Chaque fois qu'un socket est fermé, il entre dans l'état TIME_WAIT pendant un certain temps (240 secondes si je me souviens bien). À chaque fois que vous faites une requête, un socket est consommé dans la plage dynamique par défaut (je pense qu'il y a environ 5000 ports dynamiques juste au-dessus de 1024), et à chaque fin de demande, ce socket particulier entre en TIME_WAIT. Si vous faites suffisamment de requêtes, vous finirez par consommer tous les ports disponibles, ce qui entraînera une erreur TCP 10048.
Généralement, WCF essaie d'éviter ce problème en utilisant des pools de connexions et des choses comme ça. C'est généralement le cas avec les services internes qui ne vont pas sur internet. Je ne suis pas sûr si l'une des liaisons wsHttp prend en charge le pooling des connexions, mais la liaison netTcp devrait le faire. Je suppose que les named pipes n'ont pas ce problème. Je ne peux pas dire la même chose pour la liaison MSMQ.
Il y a deux solutions que vous pouvez utiliser pour contourner ce problème. Vous pouvez soit augmenter la plage de ports dynamiques, soit réduire la période de TIME_WAIT. La première option est probablement la plus sûre, mais si vous consommez un volume extrêmement élevé de sockets (ce qui ne semble pas être le cas pour votre scénario), réduire TIME_WAIT est une meilleure option (ou les deux ensemble.)
Changer la plage de ports dynamiques
- Ouvrez regedit.
- Ouvrez la clé HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
- Modifiez (ou créez en tant que DWORD) la valeur MaxUserPort.
- Définissez-la sur un nombre plus élevé. (par exemple 65534)
Changer le délai TIME_WAIT
- Ouvrez regedit.
- Ouvrez la clé HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
- Modifiez (ou créez en tant que DWORD) TcpTimedWaitDelay.
- Définissez-le sur un nombre plus bas. La valeur est en secondes. (par exemple 60 pour un délai d'attente d'1 minute)
Une des solutions ci-dessus devrait résoudre votre problème. Si le problème persiste après avoir modifié la plage de ports, essayez d'augmenter la période de vos requêtes pour qu'elles se produisent moins fréquemment... cela vous donnera plus de marge de manœuvre pour contourner le délai d'attente. Je modifierais le délai d'attente en dernier recours.