9

.Net で次の TCP ポートを見つけるには、生の .net でこれを行う方法が示されていますが、WCF でこれを安全に行う方法は示されていません。

私の単体テストでは、NetTcpBinding を使用する必要があります。使用しているポートをハードコーディングしたくありません

したがって、ServiceHost で使用するときに、NetTcpBinding が空きポートを自動的に選択するようにするにはどうすればよいですか?

選択したポート (または完全なエンドポイント アドレス) を教えてもらうにはどうすればよいですか?

または、.NET を使用して、サーバーがバインドするのに有効ないくつかのポートを見つけるにはどうすればよいですか?


私の報奨金が新しい答えにつながらなかったことを考えると、良い答えはないと推測できると思います。

4

5 に答える 5

11

独自のポート検索ロジックを展開する必要はありません。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;
于 2014-07-28T14:55:33.650 に答える
4

ポートをゼロに設定します。これにより、OS が使用可能なポートを選択できるようになります。どのポートが使用されたかを判断する必要がある場合は、ソケットがローカルにバインドされた後、ソケットからクエリを実行できます。

于 2010-01-05T21:08:50.737 に答える
2

これが私がすることです:範囲1025-2000(任意に選択された範囲)のランダムなポートから始めます。バインドしようとしましたが、失敗した場合は例外をキャッチします。次に、port = port % 2000 + 1025ラップするまで1つのポートを上に移動します()。ポートがバインドされていないので、テストに失敗することを諦めます。

于 2009-11-26T13:27:38.633 に答える
1

ランダムな高いポートを使用すると、プログラムの後に開始したい他のサーバー プロセスとの衝突が発生する可能性があります。ポート番号としてゼロを使用し、OS に予約を任せます (UNIX では /etc/services、Windows がそれをどのように処理するかはわかりません)。

于 2009-12-01T09:53:26.530 に答える