WCF:Net.TCP複数のバインディング、同じポート、異なるIPアドレス
-
22-08-2019 - |
質問
私が問題に遭遇しました。私は、WCFで少し新しいですので、任意の助けを大幅にappreaciatedされるだろう。
ここに私のコードです:
public static void StartHosts()
{
try
{
// Create a new host
ServiceHost host = new ServiceHost(typeof(ServerTasks));
List<IPAddress> ips = new List<IPAddress>(Dns.GetHostAddresses(Dns.GetHostName()));
if (IPAddress.Loopback != null)
ips.Add(IPAddress.Loopback);
ips.RemoveAll(i => i.AddressFamily != AddressFamily.InterNetwork);
foreach (var ip in ips)
{
string uri = string.Empty;
// Formulate the uri for this host
uri = string.Format(
"net.tcp://{0}:{1}/ServerTasks",
ip.ToString(),
ServerSettings.Instance.TCPListeningPort
);
// Add the endpoint binding
host.AddServiceEndpoint(
typeof(ServerTasks),
new NetTcpBinding(SecurityMode.Transport) { TransferMode = TransferMode.Streamed },
uri
);
}
// Add the meta data publishing
var smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"net.tcp://localhost/ServerTasks/mex"
);
// Run the host
host.Open();
}
catch (Exception exc)
{
DebugLogger.WriteException(exc);
}
}
; 'host.Open()':例外がライン上でスローされます
の例外は、次のとおりです。
の のSystem.InvalidOperationExceptionがののの 登録はすでにURI '://192.168.1.45:net.tcp 4329 /のServerTasks' のために存在する。の
私は、クライアント・アプリケーションは、彼らがそれを見るものは何でも、ネットワークからサービスに到達できるように、マシン上のすべてのネットワーク・アドレスにバインドされて何をしようとしています。私はこのコードを実行すると、それは検索し、127.0.0.1など約5異なるIPアドレス、バインディングを設定しようとします。
192.168.1.45は、それがバインドしようとする2番目のIPです。それは私が見ることができる例外をスロー時点で、プログラムはポート4329.上のリストの最初のIPにバインドされたこと(netstatコマンドを使用して)例外で述べたアドレスにポート4329にバインドされていないものがあります。
申し訳ありませんが多くの詳細がありません、私は簡潔なポストを与えたかったです。誰もが任意のより多くの情報を必要とする場合、私はそれを供給させていただきます。
注:私は、foreachループ内で作成されますNetTcpBindingをtrueにPortSharingEnabledを設定しようとしましたが、私はまだ同じエラーを経験した。
すべてのヘルプやアドバイスを大幅にappreaciatedことでしょう!
おかげ
解決
情報Corazzaをありがとう!
私はこれを実現する方法を考え出しました。私はこれについて、すべての間違った方法を行っていた。
私の究極の目標は、マシンで使用可能なすべてのIPアドレス上でリスニングサービスを持っていることでした。個別アドレスにバインドしようとすると、これを行うの間違った方法である。
その代わり、私は唯一のマシンののホスト名にサービスをバインドするために必要なの(「localhost」のではない)とWCFは、自動的にすべてのアダプタをリッスンします。
ここで修正されたコードです
public static void StartHosts()
{
try
{
// Formulate the uri for this host
string uri = string.Format(
"net.tcp://{0}:{1}/ServerTasks",
Dns.GetHostName(),
ServerSettings.Instance.TCPListeningPort
);
// Create a new host
ServiceHost host = new ServiceHost(typeof(ServerTasks), new Uri(uri));
// Add the endpoint binding
host.AddServiceEndpoint(
typeof(ServerTasks),
new NetTcpBinding(SecurityMode.Transport)
{
TransferMode = TransferMode.Streamed
},
uri
);
// Add the meta data publishing
var smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"net.tcp://localhost/ServerTasks/mex"
);
// Run the host
host.Open();
}
catch (Exception exc)
{
DebugLogger.WriteException(exc);
}
}
他のヒント
メル、
私は自分の前にこれを試したことはありませんが、ここで私が前に聞いたことを見ていくつかのサンプルです。アドレスの1の関係:あなたは最初にあなたのバインディングオブジェクトを作成し、その後、私はどこかにnetTCPBindingsが1であることを読んで覚えているあなたが新しいバインディングを毎回作成していないので、AddServiceEndpoint方法、ちょうど思考に同じインスタンスを追加することもできます(あなたは異なるアドレスを使用しているにもかかわらず)。
私はあなたが開く複数のポートとしてポート共有を心配する必要はないと思います。
ここでは、複数のポートで達成したいかもしれないもののサンプルです。
ます。http://www.aspfree。 COM / C / A / Windowsの-スクリプティング/ WCF-と-バインディング/ 2 / の
ここでNetTcpBindingにportsharing使用するための良いサンプルです。
http://blogs.msdn.com/drnick /archive/2006/08/08/690333.aspxする
-Bryan
私は少し遅れて:)てるように見えます。ます。
- しかし、いずれにせよ、WCFは、利用可能なすべてのネットワーク・インタフェース「://0.0.0.0 8523 / WCFTestService net.tcp」を聞くようにする非常に簡単な方法があります