Caricamento della sezione di configurazione System.ServiceModel mediante ConfigurationManager


55

Utilizzando C# .NET 3.5 e WCF, sto provando a scrivere alcune delle configurazioni WCF in un'applicazione client (il nome del server a cui si sta connettendo il client).

Il modo più ovvio è utilizzare ConfigurationManager per caricare la sezione di configurazione e scrivere i dati di cui ho bisogno.

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

Sembra restituire sempre null.

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

Funziona perfettamente.

La sezione di configurazione è presente in App.config ma per qualche motivo ConfigurationManager si rifiuta di caricare la sezione system.ServiceModel.

Voglio evitare di caricare manualmente il file xxx.exe.config e utilizzare XPath ma se devo ricorrere a ciò lo farò. Sembra un po 'un trucco.

Qualche suggerimento?

45

L'elemento <system.serviceModel> è una sezione di configurazione gruppo, non una sezione. Avrai bisogno di usare System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() per ottenere l'intero gruppo.


55

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

sembra funzionare bene.

+1

la linea di confusione per endpointCollection = clientSection.ElementInformation.Properties [string.Empty] .Value come ChannelEndpointElementCollection; deve essere semplificato in clientSection.Endpoints; 23 ott. 132013-10-23 01:56:19


14

Questo è quello che stavo cercando grazie a @marxidad per il puntatore.

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; 
    } 

8

GetSectionGroup() non supporta parametri (nella struttura 3.5).

utilizzare invece:

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

7

Grazie alle altre manifesti questa è la funzione che ho sviluppato per ottenere l'URI di un endpoint di nome. Inoltre, crea un elenco degli endpoint in uso e che il file di configurazione attuale è stato utilizzato quando il debug:

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