NetTcpBinding(WCF)で空いているTCPポートを見つけるにはどうすればよいですか(サーバーがバインドできるように)
-
05-07-2019 - |
質問
.Netで次のTCPポートを探すこれを未加工の.netで行いますが、WCFでこれを安全に行う方法ではありません。
ユニットテストでは、NetTcpBindingを使用する必要があります。使用しているポートをハードコーディングしたくない。
したがって、ServiceHostでNetTcpBindingを使用して自動的に空きポートを選択するにはどうすればよいですか?
選択したポート(または完全なエンドポイントアドレス)を教えてもらうにはどうすればよいですか?
または.NETを使用して、サーバーがバインドするのに有効ないくつかのポートを見つけるにはどうすればよいですか?
賞金が新しい答えにつながらなかったことを考えると、良い答えはないと仮定できると思います。
解決 6
現時点では、これを行うことはできません。仕事を提供してくれたすべての人に感謝します。
他のヒント
独自のポート検索ロジックを実行する必要はありません-0を指定すると、Windowsは空きポートを選択します。次に、ディスパッチャに問い合わせることにより、どのポートが割り当てられているかを確認できます。
// 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;
ポートをゼロに設定します。これにより、OSは使用可能なポートを選択できます。どのポートが使用されたかを判断する必要がある場合は、ソケットがローカルにバインドされた後、ソケットからクエリを実行できます。
ここで私がしていることは、1025-2000の範囲のランダムなポートから開始することです(範囲は任意に選択されます)。バインドしようとしますが、失敗した場合は例外をキャッチします。次に、ラップするまでポートを1つ上げます( port = port%2000 + 1025
)。ポートがバインドされていないため、テストの失敗をあきらめます。
4年後.. 現在、 MSDN
ここにエンドポイント構成の小さな例
<endpoint address="service"
binding="netTcpBinding"
contract="Iservice"
name="TcpBinding"
bindingConfiguration="netTcpBindingNoSec"
listenUriMode="Unique"
/>
そして次の問題:ポートが動的な場合、クライアントはどのようにそれを知ることができますか? この回答に記載されているように、 WCF DISCOVERY :サーバーとサーバーの両方で少し構成が必要です。クライアント側ですが、それはうまく機能します(それを取得するのに数秒かかります、デフォルトでは20秒ですが、5に強制する問題はありません)
ランダムな高ポートを使用すると、プログラムの後に開始したい他のサーバープロセスとの衝突を生成できます。 ポート番号としてゼロを使用し、OSに予約を気にさせます(Unixの/ etc / services、Windowsでの処理方法がわからない)。