J'ai un service Net.TCP WCF, et j'aimerais que le système d'exploitation choisisse le port de l'écoute. Donc j'ai défini le port sur 0 dans mon URI et Comment puis-je trouver le port réel qui a été cueilli, dans Code, à l'intérieur du processus de service? P> Quelqu'un code pour montrer ce que j'ai essayé: p> netstat code> confirme que le système d'exploitation a choisi un port dans la plage 5000.
3 Réponses :
Je ne sais pas si cela aidera, mais il y a déjà une question similaire sur: Comment puis-je obtenir l'adresse d'écoute / Port d'un service WCF?
La partie pertinente d'une réponse soumise que vous voudrez peut-être essayer: p> alors peut-être que vous avez besoin J'espère que cela aide! P> p> channeldispatcher .Listener.uri.port code>. P>
@D Hoerster: Malheureusement, cela redonne l'URI que j'ai transmis. Merci pour le pointeur à l'autre question.
@D Hoerster: on dirait que nous avons un gagnant. J'ai aussi dû définir endpoint.listenurimode = lutchimode.unique; Pour que cela fonctionne (et désactive le partage des ports sur la liaison).
Avez-vous fait votre appel à ouvrir?
Au fur et à mesure, vous pouvez trouver un port libre pour WCF pour vous utiliser: code de ici . P> p>
Ceci n'est pas sûr. Quelqu'un d'autre peut arracher le port après la disposition de la prise, mais avant l'ouverture du service ServiceHost. Donc, cette méthode peut échouer sporadiquement.
Une fois que le service a commencé, vous pouvez obtenir une description complète des points d'extrémité qui ont été créés à partir de la collection Description.endpoints (cela ne fonctionne pas avant la fin de l'ouverture (). De cette collection, vous pouvez obtenir l'adresse. Malheureusement, vous devez faire l'analyse de l'adresse du port.
C'est ce que mon serveur se connecte après chaque service ouvert (). P>
serviceHost.Open(); // Iterate through the endpoints contained in the ServiceDescription System.Text.StringBuilder sb = new System.Text.StringBuilder(string.Format("Active Service Endpoints:{0}", Environment.NewLine), 128); foreach (ServiceEndpoint se in serviceHost.Description.Endpoints) { sb.Append(String.Format("Endpoint:{0}", Environment.NewLine)); sb.Append(String.Format("\tAddress: {0}{1}", se.Address, Environment.NewLine)); sb.Append(String.Format("\tBinding: {0}{1}", se.Binding, Environment.NewLine)); sb.Append(String.Format("\tContract: {0}{1}", se.Contract.Name, Environment.NewLine)); foreach (IEndpointBehavior behavior in se.Behaviors) { sb.Append(String.Format("Behavior: {0}{1}", behavior, Environment.NewLine)); } } Console.WriteLine(sb.ToString());
Il est assez inhabituel d'obtenir un service à écouter sur un port aléatoire - y a-t-il une raison pour laquelle vous voulez faire cela?
@COCOWALLA: Le service fait partie d'un processus de travailleur, il peut donc y en avoir plus d'un à l'heure et nous examinons des solutions qui n'impliquent pas le partage de ports TCP.
duplicaillier possible de Comment puis-je obtenir le Adresse d'écoute / port d'un service WCF?