2009-11-26 4 views
9

Find the next TCP port in .Net sagt, wie dies in rohen .net, aber nicht wie man dies sicher mit WCF.Wie kann ich einen TCP-Port finden, der frei ist mit NetTcpBinding (WCF) (also kann ein Server an ihn binden)

In meinen Komponententests muss ich die NetTcpBinding verwenden, Ich möchte den Port nicht hart codieren, den es verwendet.

Also, wie kann ich die NetTcpBinding automatisch einen freien Port wählen, wenn in meinem ServiceHost verwendet?

Wie kann ich den Port (oder die vollständige Endpunktadresse) angeben, den er ausgewählt hat?

Oder wie kann ich mit .NET einen Port finden, der für einen Server gültig ist, an den er bindet?

Da mein Kopfgeld zu keiner neuen Antwort geführt hat, können wir davon ausgehen, dass es keine gute Antwort gibt.

+0

Bitte markieren Sie den Post als Antwort. Es funktioniert definitiv, also machen Sie es für neue Besucher klar. –

Antwort

0

Derzeit glaube ich, das ist nicht möglich, danke für alle, die eine Runde Arbeit zur Verfügung gestellt.

+0

Es ist möglich, siehe meine Antwort. –

2

Hier ist, was ich tue: Beginnen Sie mit einem zufälligen Port im Bereich 1025-2000 (Bereich willkürlich gewählt). Ich versuche, es zu binden, und wenn es scheitert, erhalte ich die Ausnahme. Dann gehe ich einen Port nach oben (port = port % 2000 + 1025) bis ich umlege. Ich bin kein Port gebunden, ich gebe den Test nicht auf.

+0

+1 das ist ziemlich viel was ich mache. Funktioniert gut, obwohl ich bei ungefähr 5000 anfange. –

+0

wie stoppen Sie die Windows-Brandmauer, die es öffnet, ist Großbritannien jedes Mal, das Sie einen Hafen versuchen? –

+0

uh, ich weiß nicht über diese Firewall-Sache; Meine Entwicklungsmaschine hat keine Firewall, wie es in Firewall-Netzwerk – Marcin

1

Wenn Sie einen zufälligen hohen Port verwenden, können Sie Kollisionen mit anderen Serverprozessen generieren, die nach Ihrem Programm gestartet werden sollen. benutze einfach null als portnummer und lass den os sich um reservierungen kümmern (/ etc/services auf unix, weis nicht, wie windows damit umgehen).

+0

Entschuldigung, ich sorge mich nur über Windows –

4

Den Port auf Null setzen. Dadurch kann das Betriebssystem einen verfügbaren Port für Sie auswählen. Wenn Sie herausfinden müssen, welcher Port verwendet wurde, können Sie das vom Socket abfragen, nachdem dieser lokal gebunden wurde.

+2

Wie bekomme ich den Socket von der NetTcpBinding WCF, wenn ich in einem Port von 0 übergeben? –

1

4 Jahre später .. am heutigen Tag haben wir eine Lösung haben, ListenUriMode-Unique Einstellung, wie aus MSDN

Hier ist ein kleines Beispiel für eine Endpunktkonfiguration

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

Und jetzt

erklärte die nächstes Problem: Wenn der Port dynamisch ist, wie können Clients das wissen? Wie in THIS ANSWER angegeben, können Sie WCF DISCOVERY verwenden: es erfordert eine kleine Konfiguration auf der Server-und Client-Seite, aber es funktioniert gut (mit dem einzigen Problem, dass es einige Sekunden dauert, um es zu erhalten, standardmäßig 20 Sekunden, aber ich habe keine Probleme erzwingen 5)

8

Sie brauchen keine eigene Portfindungslogik zu erstellen - Windows wählt einen freien Port, wenn Sie ihn als 0 angeben. Dann können Sie herausfinden, welcher Port zugewiesen wurde, indem Sie die Dispatcher abfragen:

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

Dies sollte als Antwort markiert werden –

Verwandte Themen