Wie kann ich ein TCP-Port finden, die mit NetTcpBinding (WCF) frei ist (so ein Server daran binden kann)

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

Frage

Finden Sie die nächste TCP-Port in .Net sagt, wie man dies geschieht in rohen .net, aber nicht, wie man sicher darauf mit WCF.

In meinen Unit-Tests, ich brauche das NetTcpBinding zu verwenden, Ich mag nicht zu hart Code den Port wird mit .

Deshalb, wie kann ich das NetTcpBinding, um automatisch einen freien Port zu wählen, wenn in meinem Servicehost verwendet?

Wie kann ich es mir zu sagen, den Port (oder vollständige Endpunktadresse) es gewählt hat?

Oder wie kann ich mit .NET ein paar Port finden, die gültig ist für einen Server? Binden


Da meine Prämie auf neue Antworten nicht führen, glaube ich, dass wir es annehmen kann keine gute Antwort.

War es hilfreich?

Lösung 6

Derzeit Ich glaube dies nicht möglich ist, vielen Dank für alle, die Arbeit zur Verfügung gestellt ein Runden.

Andere Tipps

Sie müssen keine eigenen Port Findungslogik rollen - Fenster einen freien Port wählen, wenn Sie es als 0 angeben Dann können Sie herausfinden, welcher Port durch Abfrage der Disponenten zugewiesen wurde, etwa so:

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

Stellen Sie den Port auf Null. Das ermöglicht es dem OS einen verfügbaren Port für Sie zur Auswahl. Wenn Sie ermitteln müssen, welcher Port verwendet wurde, können Sie, dass aus der Steckdose abfragen, nachdem sie lokal gebunden ist.

Hier ist, was ich tun: mit einem zufälligen Port in Bereich beginnen 1025-2000 (Bereich willkürlich gewählt). Ich versuche, es zu binden und wenn es scheitert ich die Ausnahme abfangen. Dann gehe ich einen Anschluss nach oben (port = port % 2000 + 1025), bis ich wickeln. Ich kein Port gebunden ist, ich den Test nicht aufgeben.

4 Jahre später .. am heutigen Tag haben wir eine Lösung, ListenUriMode, von Unique Einstellung = "http://msdn.microsoft.com/en-us/library/system.servicemodel.description.listenurimode%28v=vs. 110% 29.aspx“rel = "nofollow noreferrer"> MSDN

Hier ist ein kleines Beispiel für eine Endpunktkonfiguration

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

Und nun das nächste Problem: Wenn der Port dynamisch ist, wie können Kunden wissen es? Wie in WCF DISCOVERY : es erfordert eine wenig Konfiguration auf dem Server und Client-Seite, aber es funktioniert gut (mit dem einzigen Problem, dass es einige Sekunden dauert, um es zu bekommen, die standardmäßig 20 Sekunden, aber ich habe keine Probleme, es zu 5 zwingen)

, wenn ein zufällig hoch Port Sie Kollisionen mit anderen Server-Prozessen erzeugen können, die nach dem Programm gestartet werden sollen. nur Null als Portnummer verwenden und die os kümmern uns um Reservierungen lassen (/ etc / services auf Unix, weiß nicht, wie Fenster Griffe it).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top