61 votes

Chargement de la section de configuration de 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 client (le nom du serveur auquel le client se connecte).

Le moyen le plus évident est d'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 retourner null.

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

Fonctionne parfaitement.

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

Je veux éviter de charger manuellement le fichier xxx.exe.config et d'utiliser XPath, mais si je dois y recourir, je le ferai. C'est juste que ça semble être un peu un hack.

Des suggestions ?

61voto

DavidWhitney Points 1957

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

Il semble que cela fonctionne bien.

48voto

Mark Cidade Points 53945

Le site <system.serviceModel> est destiné à une section de configuration groupe et non une section. Vous devrez utiliser System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() pour avoir tout le groupe.

16voto

DavidWhitney Points 1957

C'est ce que je cherchais, merci à @marxidad pour le pointeur.

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

10voto

midspace Points 595

GetSectionGroup() ne supporte pas l'absence de paramètres (sous framework 3.5).

Utilisez plutôt :

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

7voto

Robin G Brown Points 337

Grâce aux autres posters, voici la fonction que j'ai développée pour obtenir l'URI d'un endpoint nommé. Elle 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 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X