Como posso encontrar uma porta TCP que é livre com NetTcpBinding (WCF) (para um servidor pode ligar-se a ele)

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

Pergunta

Procura a próxima porta TCP em .Net diz como fazer isso no .net cru, mas não como segurança para isso com WCF.

Em meus testes de unidade, eu preciso usar o NetTcpBinding, Eu não deseja código rígido a porta que está usando .

Portanto, como posso obter o NetTcpBinding para automaticamente escolher um porto livre, quando usado em minha ServiceHost?

Como posso obtê-lo para me dizer a porta (ou endereço de endpoint completa) que escolheu?

Ou como posso usar .NET encontrar uma porta poucos que é válida por um servidor para se ligam a?


Dado que minha generosidade não levaram a quaisquer novas respostas, eu acho que podemos assumir que não há boa resposta.

Foi útil?

Solução 6

No momento eu acredito que isso não é possível, obrigado por todos que forneceram o trabalho de um rodadas.

Outras dicas

Você não precisa rolar sua própria lógica de apuramento de porta - Windows irá escolher uma porta livre se você especifique-o como 0. Em seguida, você pode descobrir qual porta foi atribuído pela interrogar os despachantes, assim:

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

Defina a porta para zero. Que permite que o OS para escolher uma porta disponível para você. Se você precisa para determinar qual porta foi utilizado, você pode consultar que da tomada após ter sido vinculado localmente.

Aqui está o que eu faço: começar com uma porta aleatória na faixa 1025-2000 (intervalo escolhido arbitrariamente). Eu tento ligá-la e, se falhar Eu capturar a exceção. Então eu vou uma porta para cima (port = port % 2000 + 1025) até eu quebrar. I nenhuma porta for obrigado, eu desisto falhando no teste.

4 anos mais tarde .. nos dias de hoje temos uma solução, definindo ListenUriMode para Unique, como indicado a partir de MSDN

Aqui um pequeno exemplo de um endpoint de configuração

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

E agora o problema seguinte: Se a porta é dinâmico como pode clientes sabem isso? Como indicado no esta resposta você pode usar WCF DISCOVERY : ela requer um pouco de configuração no servidor e do lado do cliente, mas ele funciona bem (com o único problema que leva alguns segundos para obtê-lo, por padrão 20 segundos, mas eu não tenho problemas forçando-o a 5)

quando se usa uma porta alta aleatória pode gerar colisões com outros processos do servidor que querem começar após o seu programa. basta usar zero como o número da porta e deixar o cuidado OS sobre reservas (/ etc / services no UNIX, não sei como o Windows lida com isso).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top