2009-01-27 6 views
0

Dans l'extrait de fichier de configuration suivant, le service WCF a deux points de terminaison.Indexation ServiceEndpointElementCollection

<service behaviorConfiguration="AtomTcpHub.Behavior" 
      name="AtomTcpHub.HubTcp"> 
    <endpoint address="" binding="netTcpBinding" 
       name="AtomHubEndpoint" contract="AtomLib.IAtomPublisher"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" 
       name="" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/AtomTcpHub/" /> 
     <add baseAddress="net.tcp://dv-pw/AtomTcpHub/" /> 
     </baseAddresses> 
    </host> 
    </service> 

Dans mon code, il est logique de découverte, qui répond à une demande UDP en répondant à la connexion Uri pour le service WCF. L'obtention d'une collection de points de terminaison est simple.

System.Configuration.Configuration config = System.Configuration 
    .ConfigurationManager 
    .OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None); 
ServicesSection section = config.SectionGroups["system.serviceModel"] 
    .Sections["services"] as ServicesSection; 
ServiceEndpointElementCollection seec = 
    section.Services["AtomTcpHub.HubTcp"].Endpoints; 

Le problème est l'extraction du ServiceEndpointElement. Nous pouvons l'avoir par l'index:

ServiceEndpointElement see = seec[0]; 

mais c'est cassant; Si l'ordre des nœuds change, il se cassera. Visual Studio m'indique qu'il existe un autre indexeur permettant une valeur d'objet, mais il n'y a pas d'autre indication. L'expérimentation me dit que n'est pas la valeur de l'attribut name.

Le code suivant fonctionne, mais il est juste hideux.

string serviceEndpointUri; 
foreach(ServiceEndpointElement serviceEndpointElement in seec) 
    if (serviceEndpointElement.Name == "AtomHubEndpoint") 
    { 
    _serviceEndpointUri = serviceEndpointElement.Address.AbsoluteUri; 
    break; 
    } 

Existe-t-il une façon plus directe ou plus élégante de faire cela?

+0

Bonjour. Je sais que c'est une vieille question, mais dans le cas où vous vous êtes «toujours demandé», je vous recommande de regarder le code source de la méthode ServiceEndpointElementCollection.GetElementKey (ConfigurationElement). Le commentaire là-bas m'a fait rire de moi-même après avoir perdu beaucoup de temps à essayer de résoudre ce même problème. (Je le signalerais ici comme une réponse, mais je ne sais pas si MS le permet.) – Kimberly

Répondre

2

Vous pouvez toujours utiliser un Linq pour accomplir cela, simplement raccourcir les choses un peu.

ServiceEndpointElement element = 
seec.OfType<ServiceEndpointElement>() 
.FirstOrDefault(s => s.Name == "AtomHubEndpoint"); 
+0

Pas tout à fait une recherche de hachage; ça cache juste la boucle. Mais je pense que c'est aussi bon que possible. –

Questions connexes