Como posso encontrar uma porta TCP que é livre com NetTcpBinding (WCF) (para um servidor pode ligar-se a ele)
-
05-07-2019 - |
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.
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).