Laden des System.ServiceModel-Konfigurationsabschnitts mit ConfigurationManager
-
09-06-2019 - |
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?
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