Comment puis-je créer une classe HttpListener sur un port aléatoire en C#?
Je voudrais créer une application qui sert de pages web en interne et peut être exécuté en plusieurs instances sur la même machine. Pour ce faire, je voudrais créer un HttpListener
qui écoute sur un port qui est:
- Choisis au hasard
- Actuellement inutilisés
Essentiellement, ce que je voudrais, c'est quelque chose comme:
mListener = new HttpListener();
mListener.Prefixes.Add("http://*:0/");
mListener.Start();
selectedPort = mListener.Port;
Comment puis-je y arriver?
InformationsquelleAutor | 2008-10-21
Vous devez vous connecter pour publier un commentaire.
TcpListener trouverez un hasard non utilisés port à écouter si vous liez à port 0.
Comment quelque chose comme cela:
Je ne suis pas sûr de savoir comment vous trouver tous les ports en cours d'utilisation sur la machine, mais vous devriez obtenir une exception si vous essayez d'écouter sur un port est déjà utilisé, auquel cas la méthode de simplement choisir un autre port.
MinPort
/MaxPort
constantes au lieu de cela, MSDN lienMinPort
constante est égale à zéro. La valeur minimale donnée dans la réponse est plus adapté.mListener
. Aussi,usedPorts
devriez être unSet<int>
linéaire d'adhésion d'essai. Personnellement, je serais portéeusedPorts
à l'intérieur de la méthode (ou de se débarrasser d'elle complètement) que si vous avez utilisé ce dans une très longue-système en cours d'exécution, vous pourrait éventuellement manquer de ports, prise de lawhile
boucle de courir pour toujours, même si les ports disponibles au cours du temps.Voici une réponse, dérivé de Snooganz réponse. Il évite la condition de la course entre les tests pour la disponibilité, et plus tard de liaison.
Sur ma machine cette méthode prend 15ms en moyenne, ce qui est acceptable pour mon cas d'utilisation. Espérons que cela aide quelqu'un d'autre.
Puisque vous êtes à l'aide d'un HttpListener (et donc les connexions TCP), vous pouvez obtenir une liste de TCP active des auditeurs à l'aide de
GetActiveTcpListeners
méthode de laIPGlobalProperties
objet et à l'inspection de leursPort
propriété.La solution peut ressembler à ceci:
Ce code trouverez d'abord de port non utilisé au début de la
startingPort
numéro de port et de retourtrue
. Dans le cas où tous les ports sont déjà occupés (ce qui est très rare) la méthode renvoiefalse
.Également garder à l'esprit la possibilité d'une condition de concurrence peut se produire lorsque certains autres processus prend la trouvé de port avant de le faire.
ref
et pasout
?Je vous recommande d'essayer Grapevine. Il vous permet d'intégrer un REPOS/serveur HTTP dans votre application. Il comprend un
RestCluster
classe qui vous permettra de gérer l'ensemble de vosRestServer
cas dans un seul endroit.Définir chaque instance d'utiliser un hasard, ouvrez le numéro de port comme ceci:
Guide de mise en route: https://sukona.github.io/Grapevine/en/getting-started.html
Je ne crois pas que ce soit possible. La documentation pour UriBuilder.Les états du Port, "Si un port n'est pas spécifié dans le cadre de l'URI, ... la valeur de port par défaut pour le protocole sera utilisé pour se connecter à l'hôte.".
Voir https://msdn.microsoft.com/en-us/library/system.uribuilder.port(v=vs. 110).aspx
Malheureusement, ce n'est pas possible. Comme Richard Dingwall déjà suggéré, vous pouvez créer un écouteur TCP et utiliser ce port. Cette approche a deux problèmes possibles: