8
votes

Comment puis-je obtenir le port qu'un service WCF écoute?

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 netstat confirme que le système d'exploitation a choisi un port dans la plage 5000.

Comment puis-je trouver le port réel qui a été cueilli, dans Code, à l'intérieur du processus de service?

Quelqu'un code pour montrer ce que j'ai essayé: xxx


3 commentaires

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?


3 Réponses :


11
votes

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: xxx

alors peut-être que vous avez besoin channeldispatcher .Listener.uri.port .

J'espère que cela aide!


3 commentaires

@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?



1
votes

Au fur et à mesure, vous pouvez trouver un port libre pour WCF pour vous utiliser: xxx

code de ici .


1 commentaires

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.



3
votes

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());


0 commentaires