Cargando la sección de configuración de System.ServiceModel usando ConfigurationManager

Con C # .NET 3.5 y WCF, estoy intentando escribir parte de la configuración de WCF en una aplicación cliente (el nombre del servidor al que se está conectando el cliente).

La forma obvia es usar ConfigurationManager para cargar la sección de configuración y escribir los datos que necesito.

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

Parece que siempre devuelve nulo.

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

Funciona perfectamente.

La sección de configuración está presente en App.config, pero por alguna razón, ConfigurationManager niega a cargar la sección system.ServiceModel .

Quiero evitar cargar manualmente el archivo xxx.exe.config y usar XPath, pero si tengo que recurrir a eso, lo haré. Simplemente parece un poco de un hack.

¿Alguna sugerencia?

El elemento es para un grupo de sección de configuración, no una sección. Deberá usar System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() para obtener todo el grupo.

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[string.Empty].Value as ChannelEndpointElementCollection; List endpointNames = new List(); foreach (ChannelEndpointElement endpointElement in endpointCollection) { endpointNames.Add(endpointElement.Name); } // use endpointNames somehow ... 

Parece funcionar bien.

Esto es lo que buscaba gracias a @marxidad por el puntero.

  public static string GetServerName() { string 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 () no admite parámetros (en el marco 3.5).

En su lugar, utilice:

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

Gracias a los otros carteles, esta es la función que desarrollé para obtener el URI de un punto final nombrado. También crea una lista de los puntos finales en uso y qué archivo de configuración real se estaba utilizando al depurar:

 Private Function GetEndpointAddress(name As String) As String Debug.Print("--- GetEndpointAddress ---") Dim address As String = "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.ToString) If endpoint.Name = name Then address = endpoint.Address.ToString End If Next Debug.Print("--- GetEndpointAddress ---") Return address End Function