La WCF: Net.TCP liaisons multiples, même port, des Adresses IP différentes
J'ai couru dans un problème. Je suis un petit nouveau à la WCF de sorte que toute aide serait grandement appréciés.
Voici mon 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);
}
}
Une exception est levée sur la ligne: 'hôte.Open();'
L'exception est la suivante:
Système.InvalidOperationException
Un enregistrement existe déjà pour les URI net.tcp://192.168.1.45:4329/ServerTasks'.
Ce que je suis en train de faire est de se lier à toutes les adresses réseau sur la machine de sorte que les applications client peut accéder au service à partir de quel que soit le réseau qu'ils le voient sur. Lorsque j'exécute ce code, il trouve et tente d'établir une liaison pour environ 5 IPs différentes, y compris l'adresse 127.0.0.1.
192.168.1.45 est la deuxième adresse IP qu'il tente de lier. Au point qu'il lève l'exception que je peux voir (à l'aide de la commande netstat) que le programme est lié à la première adresse IP dans la liste sur le port 4329. Il n'y a pas quelque chose lié au port 4329 sur l'adresse mentionnée dans l'exception.
Désolé il n'y a pas beaucoup de détails, j'ai voulu donner une description concise de la poste. Si quelqu'un a besoin de plus d'info, je serai heureux de les lui fournir.
Note: j'ai essayé de réglage PortSharingEnabled à vrai pour les NetTcpBinding qui vient d'être créé à l'intérieur de la boucle foreach, mais je ressentais toujours la même erreur.
Toute aide ou conseil serait grandement appréciés!
Grâce
OriginalL'auteur Mel Green | 2009-03-31
Vous devez vous connecter pour publier un commentaire.
Merci pour l'info Corazza!
J'ai compris comment accomplir cela. J'allais à propos de tout cela dans le mauvais sens.
Mon but ultime était d'avoir le service d'écoute sur toutes les Adresses IP disponibles sur la machine. En essayant de lier à chaque adresse individuellement est la mauvaise façon de le faire.
Au lieu de cela, j'ai seulement besoin de lier le service de la machine Nom d'Hôte (et non pas 'localhost') et WCF écoute automatiquement sur toutes les cartes.
Voici le code corrigé:
OriginalL'auteur Mel Green
Mel,
Alors que je n'ai jamais essayé cela avant moi-même, voici quelques échantillons de regarder ce que j'ai entendu avant. Vous pouvez créer votre objet de liaison, puis ajouter la même instance de la AddServiceEndpoint méthode, juste une pensée de sorte que vous n'êtes pas la création de nouvelles liaisons à chaque fois que je me souviens avoir lu quelque part que netTCPBindings devrait être une relation 1:1 avec l'adresse (même si vous utilisez des adresses différentes).
Je ne pense pas que vous ayez à vous soucier de partage de port que votre ouverture de plusieurs ports.
Voici un échantillon de ce que vous voulez accomplir avec plusieurs ports.
http://www.aspfree.com/c/a/Windows-Scripting/WCF-and-Bindings/2/
Voici un bon exemple pour l'utilisation de portsharing sur le NetTcpBinding.
http://blogs.msdn.com/drnick/archive/2006/08/08/690333.aspx
-Bryan
OriginalL'auteur Bryan Corazza
Semble que je suis un peu en retard :). Mais de toute façon - il est tout à fait simple de la façon de faire de la Wcf écouter toutes les interfaces réseau disponibles net.tcp://0.0.0.0:8523/WCFTestService".
OriginalL'auteur Arkady Marchenko