Come posso trovare una porta TCP libera con NetTcpBinding (WCF) (in modo che un server possa collegarsi ad essa)

StackOverflow https://stackoverflow.com/questions/1803065

Domanda

Trova la prossima porta TCP in .Net dice come farlo in raw .net, ma non come farlo in modo sicuro con WCF.

Nei test delle mie unità, devo utilizzare NetTcpBinding, non desidero codificare la porta che sta utilizzando .

Pertanto, come posso fare in modo che NetTcpBinding scelga automaticamente una porta libera quando viene utilizzato nel mio ServiceHost?

Come posso ottenerlo per comunicarmi la porta (o l'indirizzo completo dell'endpoint) che ha scelto?

O come posso usare .NET per trovare alcune porte valide per un server a cui associare?


Dato che la mia generosità non ha portato a nuove risposte, penso che possiamo supporre che non ci sia una buona risposta.

È stato utile?

Soluzione 6

Al momento credo che ciò non sia possibile, grazie per tutti coloro che hanno fornito lavoro a tutto tondo.

Altri suggerimenti

Non è necessario eseguire il rollup della propria logica di individuazione delle porte: Windows sceglierà una porta libera se la si specifica come 0. Quindi è possibile scoprire quale porta è stata assegnata interrogando i dispatcher, in questo modo:

// 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;

Imposta la porta su zero. Ciò consente al sistema operativo di scegliere una porta disponibile per te. Se è necessario determinare quale porta è stata utilizzata, è possibile interrogarla dal socket dopo che è stata associata localmente.

Ecco cosa faccio: iniziare con una porta casuale nell'intervallo 1025-2000 (intervallo scelto arbitrariamente). Provo a legarlo e se fallisce prendo l'eccezione. Quindi vado su una porta ( port = port% 2000 + 1025 ) fino a quando non lo avvolgo. Non ho nessuna porta vincolata, rinuncio a fallire il test.

4 anni dopo .. al momento abbiamo una soluzione, impostando ListenUriMode su Unique , come indicato da MSDN

Ecco un piccolo esempio di configurazione dell'endpoint

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

E ora il prossimo problema: se la porta è dinamica come possono conoscerla i client? Come indicato in QUESTA RISPOSTA puoi usare WCF DISCOVERY : richiede una piccola configurazione su entrambi i server e lato client ma funziona bene (con l'unico problema che ci vogliono alcuni secondi per ottenerlo, per impostazione predefinita 20 secondi ma non ho problemi a forzarlo a 5)

quando si utilizza una porta alta casuale è possibile generare collisioni con altri processi del server che desiderano iniziare dopo il programma. basta usare zero come numero di porta e lasciare che il sistema operativo si preoccupi delle prenotazioni (/ etc / services su unix, non so come lo gestisce Windows).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top