9
votes

Comment trouver un port TCP gratuit avec NetTcpbinding (WCF) (donc un serveur peut-il y lier)

Recherchez le prochain port TCP de .NET dit comment Faites-le dans RAW .NET, mais pas comment à cela en toute sécurité avec WCF.

Dans mes tests de l'unité, je dois utiliser le netcpbinding, Je ne souhaite pas du papier dur le port qu'il utilise .

Par conséquent, comment puis-je obtenir le netcpbinding de choisir automatiquement un port libre lorsqu'il est utilisé dans mon service de service?

Comment puis-je l'obtenir pour me dire le port (ou l'adresse du point d'extrémité complète) qu'elle a choisi?

ou comment puis-je utiliser .NET trouver un port qui est valide pour un serveur pour se lier à?


Étant donné que ma prime n'a conduit à de nouvelles réponses, je pense que nous pouvons supposer qu'il n'y a pas de bonne réponse.


1 commentaires

S'il vous plaît marquer le message de Matt comme réponse. Cela fonctionne définitivement, cela précise donc pour les nouveaux visiteurs.


5 Réponses :


2
votes

Voici ce que je fais: commencez par un port aléatoire dans la plage 1025-2000 (plage choisie arbitrairement). J'essaie de le lier et si cela échoue, j'attrape l'exception. Ensuite, je vais un port vers le haut ( port = port% 2000 + 1025 ) jusqu'à ce que je enveloppe. Je n'ai aucun port n'est lié, j'abandonne l'échec du test.


3 commentaires

Comment arrêtez-vous le pare-feu Windows en l'ouvrant à chaque fois que vous essayez un port?


Euh, je ne sais pas ce pare-feu chose; Ma machine de développement n'a pas de pare-feu dessus, comme il se trouve dans un réseau de pare-feu


Ian, je n'ai pas de pare-feu configuré sur les machines que je développe des applications réseau sur ou sur mes machines de construction, ce n'est donc pas un problème.



1
votes

Lorsque vous utilisez un port élevé aléatoire, vous pouvez générer des collisions avec d'autres processus serveur qui souhaitent démarrer après votre programme. Il suffit d'utiliser zéro comme numéro de port et laissez le système d'exploitation sur les réservations (/ etc / services sur UNIX, ne savez pas comment Windows le gère).


1 commentaires

désolé je me soucie seulement de Windows



4
votes

Définissez le port sur zéro. Cela permet au système d'exploitation de choisir un port disponible pour vous. Si vous devez déterminer quel port a été utilisé, vous pouvez interroger que de la prise après avoir été liée localement.


1 commentaires

Comment obtenir la prise de la touche NetCPPLINDING WCF, si je passe dans un port de 0?



2
votes

4 ans plus tard .. Jusqu'à présent, nous avons une solution, réglage lutchimode code> à unique code>, comme indiqué à partir de MSDN

Ici un petit exemple d'une configuration de point final p>

<endpoint address="service"
          binding="netTcpBinding"
          contract="Iservice"
          name="TcpBinding"
          bindingConfiguration="netTcpBindingNoSec"
          listenUriMode="Unique"
          />


0 commentaires

11
votes

Vous n'avez pas besoin de faire rouler votre propre logique de recherche de port - Windows choisira un port libre si vous le spécifiez comme 0. Ensuite, vous pouvez découvrir quel port a été attribué en interrogant les répartiteurs, comme:

// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);

 // Tell WCF to actually bind to a free port instead of 0
 endPoint.ListenUriMode = ListenUriMode.Unique;

 host.Open();

 // Now that the host has bound to a specific port, we can find out which one it chose
 return host.ChannelDispatchers.First().Listener.Uri;


0 commentaires