existe example contexto connectionstrings configurationsettings app actual c# .net xml wcf configurationmanager

c# - example - Cargando la sección de configuración System.ServiceModel usando ConfigurationManager



configurationmanager.connectionstrings c# (5)

Usando C # .NET 3.5 y WCF, estoy tratando de escribir algo 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 el App.config pero por algún motivo 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é. Solo parece un truco.

¿Alguna sugerencia?



Esto es lo que estaba buscando gracias a @marxidad para 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<endpoints.Count; i++) { ChannelEndpointElement endpointElement = endpoints[i]; if (endpointElement.Contract == "MyContractName") { serverName = endpointElement.Address.Host; } } return serverName; }


GetSectionGroup () no admite ningún parámetro (en el marco 3.5).

En su lugar use:

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 con nombre. 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


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

Parece que funciona bien.