Chargement de la section de configuration System.ServiceModel à l’aide de ConfigurationManager

En utilisant C # .NET 3.5 et WCF, j’essaie d’écrire une partie de la configuration WCF dans une application cliente (le nom du serveur auquel le client se connecte).

Le moyen évident consiste à utiliser ConfigurationManager pour charger la section de configuration et écrire les données dont j’ai besoin.

 var serviceModelSection = ConfigurationManager.GetSection("system.serviceModel"); 

Semble toujours renvoyer null.

 var serviceModelSection = ConfigurationManager.GetSection("appSettings"); 

Fonctionne parfaitement.

La section de configuration est présente dans App.config mais pour une raison quelconque, ConfigurationManager refuse de charger la section system.ServiceModel .

Je veux éviter de charger manuellement le fichier xxx.exe.config et d’utiliser XPath mais si je dois y recourir, je le ferai. Juste semble un peu un bidouillage.

Aucune suggestion?

L’élément est destiné à un groupe de sections de configuration et non à une section. Vous devrez utiliser System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() pour obtenir le groupe entier.

http://mostlytech.blogspot.com/2007/11/programmatically-enumerate-wcf.html

 // Automagically find all client endpoints defined in app.config ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; ChannelEndpointElementCollection endpointCollection = clientSection.ElementInformation.Properties[ssortingng.Empty].Value as ChannelEndpointElementCollection; List endpointNames = new List(); foreach (ChannelEndpointElement endpointElement in endpointCollection) { endpointNames.Add(endpointElement.Name); } // use endpointNames somehow ... 

Semble bien fonctionner.

C’est ce que je cherchais grâce à @marxidad pour le pointeur.

  public static ssortingng GetServerName() { ssortingng serverName = "Unknown"; Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ServiceModelSectionGroup serviceModel = ServiceModelSectionGroup.GetSectionGroup(appConfig); BindingsSection bindings = serviceModel.Bindings; ChannelEndpointElementCollection endpoints = serviceModel.Client.Endpoints; for(int i=0; i 

GetSectionGroup () ne prend pas en charge les parameters (sous Framework 3.5).

Au lieu de cela, utilisez:

 Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ServiceModelSectionGroup group = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(config); 

Grâce aux autres affiches, c’est la fonction que j’ai développée pour obtenir l’URI d’un noeud final nommé. Il crée également une liste des points de terminaison utilisés et le fichier de configuration utilisé lors du débogage:

 Private Function GetEndpointAddress(name As Ssortingng) As Ssortingng Debug.Print("--- GetEndpointAddress ---") Dim address As Ssortingng = "Unknown" Dim appConfig As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) Debug.Print("app.config: " & appConfig.FilePath) Dim serviceModel As ServiceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(appConfig) Dim bindings As BindingsSection = serviceModel.Bindings Dim endpoints As ChannelEndpointElementCollection = serviceModel.Client.Endpoints For i As Integer = 0 To endpoints.Count - 1 Dim endpoint As ChannelEndpointElement = endpoints(i) Debug.Print("Endpoint: " & endpoint.Name & " - " & endpoint.Address.ToSsortingng) If endpoint.Name = name Then address = endpoint.Address.ToSsortingng End If Next Debug.Print("--- GetEndpointAddress ---") Return address End Function