Frage

Mit C# .NET 3.5 und WCF versuche ich, einen Teil der WCF-Konfiguration in einer Clientanwendung auszuschreiben (den Namen des Servers, mit dem der Client eine Verbindung herstellt).

Der offensichtliche Weg ist die Verwendung ConfigurationManager um den Konfigurationsabschnitt zu laden und die benötigten Daten auszuschreiben.

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

Scheint immer null zurückzugeben.

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

Funktioniert perfekt.

Der Konfigurationsabschnitt ist in der App.config vorhanden, jedoch aus irgendeinem Grund ConfigurationManager weigert sich, das zu laden system.ServiceModel Abschnitt.

Ich möchte vermeiden, die Datei xxx.exe.config manuell zu laden und XPath zu verwenden, aber wenn ich darauf zurückgreifen muss, werde ich es tun.Scheint einfach ein kleiner Trick zu sein.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Der <system.serviceModel> Das Element ist für einen Konfigurationsabschnitt Gruppe, kein Abschnitt.Sie müssen verwenden System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() um die ganze Gruppe zu bekommen.

Andere Tipps

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

Scheint gut zu funktionieren.

Das ist es, wonach ich gesucht habe, danke an @marxidad für den Hinweis.

    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() unterstützt keine Parameter (unter Framework 3.5).

Verwenden Sie stattdessen:

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

Dank der anderen Poster habe ich diese Funktion entwickelt, um den URI eines benannten Endpunkts abzurufen.Außerdem wird eine Liste der verwendeten Endpunkte und der tatsächlichen Konfigurationsdatei erstellt, die beim Debuggen verwendet wurde:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top