WCF: Net.TCP mehrere Bindungen, gleicher port, andere IP-Adressen
Habe ich ein problem. Ich bin ein wenig neu auf der WCF, so dass jede Hilfe wäre sehr appreaciated.
Hier ist mein code:
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);
}
}
Wird eine Ausnahme ausgelöst, auf die Zeile: "host.Open();'
Ausnahme ist:
System.InvalidOperationException
Eine Registrierung bereits vorhanden ist, für URI 'net.tcp://192.168.1.45:4329/ServerTasks'.
Was ich versuche zu tun, ist binden, um alle Netzwerk-Adressen auf der Maschine, so dass die client-Anwendungen erreichen können, ist der service, von welchem Netzwerk Sie sehen es auf. Wenn ich diesen code ausführen, die es findet, und versuche, eine Bindung für über 5 verschiedene IPs, einschließlich 127.0.0.1.
192.168.1.45 ist die zweite IP, die er versucht zu binden. An dem Punkt, dass es wirft die Ausnahme, die ich sehen kann (mit netstat), die das Programm gebunden ist, um die erste IP in der Liste auf port 4329. Es gibt nichts gebunden-port 4329 auf der genannten Adresse in der Ausnahme.
Sorry es gibt nicht viele details, ich wollte einen prägnanten Beitrag. Wenn jemand braucht mehr info, werde ich Sie gerne liefern.
Hinweis: ich habe versucht Einstellung PortSharingEnabled auf true für das NetTcpBinding, die angelegt wird, in der foreach-Schleife, aber ich erlebte die gleichen Fehler.
Jede Hilfe oder Beratung wäre sehr appreaciated!
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke für die info Corazza!
Habe ich herausgefunden, wie dies zu erreichen. Ich wollte über das alles der falsche Weg.
Mein oberstes Ziel war der service lauscht auf alle IP-Adressen auf dem Computer verfügbar. Beim binden an jede Adresse einzeln ist der falsche Weg, dies zu tun.
Statt, ich brauchte nur zu binden, der service an der Maschine Host-Name (nicht 'localhost') und WCF automatisch überwacht alle Adapter.
Hier der korrigierte code:
Mel,
Während ich habe nie versucht, dies vor mir selbst, hier einige Beispiele anschauen, die ich zuvor gehört haben. Möglicherweise möchten Sie erstellen Ihre verbindliche Objekt zuerst, und dann fügen Sie die gleiche Instanz an die Methode AddServiceEndpoint, nur ein Gedanke, so sind Sie nicht die Schaffung neuer Bindungen, jedes mal wenn ich erinnere mich, irgendwo gelesen zu haben, dass netTCPBindings sollte eine 1:1-Beziehung mit Adresse (auch wenn man mit verschiedenen Adressen).
Ich glaube nicht, dass man Angst haben muss den port freigeben, als Ihr die öffnung von mehreren ports.
Hier ein Beispiel von dem was Sie erreichen wollen, mit mehreren ports.
http://www.aspfree.com/c/a/Windows-Scripting/WCF-and-Bindings/2/
Hier ist ein gutes Beispiel für die Verwendung portsharing auf die NetTcpBinding.
http://blogs.msdn.com/drnick/archive/2006/08/08/690333.aspx
-Bryan
Aussieht, ich bin etwas spät dran :). Aber wie auch immer - es ist ein ziemlich einfacher Weg, um Wcf-hören Sie alle verfügbaren Netzwerk-Schnittstellen "net.tcp://0.0.0.0:8523/WCFTestService".