Tải cấu hình System.ServiceModel bằng cách sử dụng ConfigurationManager


55

Sử dụng C# .NET 3.5 và WCF, tôi đang cố gắng viết một số cấu hình WCF trong ứng dụng khách (tên của máy khách mà máy khách đang kết nối đến).

Cách rõ ràng là sử dụng ConfigurationManager để tải phần cấu hình và ghi dữ liệu tôi cần.

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

Xuất hiện để luôn trả về giá trị rỗng.

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

Hoạt động hoàn hảo.

Phần cấu hình có trong App.config nhưng vì lý do nào đó, ConfigurationManager từ chối tải phần system.ServiceModel.

Tôi muốn tránh tải tệp xxx.exe.config theo cách thủ công và sử dụng XPath nhưng nếu tôi phải sử dụng đến đó. Có vẻ như một chút hack.

Mọi đề xuất?

45

Phần tử <system.serviceModel> dành cho phần cấu hình nhóm, không phải là một phần. Bạn sẽ cần sử dụng System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup() để nhận toàn bộ nhóm.


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

Xuất hiện để làm việc tốt.

+1

dòng khó hiểu đối với endpointCollection = clientSection.ElementInformation.Properties [string.Empty] .Value như ChannelEndpointElementCollection; phải được đơn giản hóa thành clientSection.Endpoints; 23 oct. 132013-10-23 01:56:19


14

Đây là những gì tôi đang tìm kiếm nhờ @marxidad cho con trỏ.

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() không hỗ trợ không có thông số (trong khung 3.5).

Thay vì sử dụng:

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

7

Nhờ các áp phích khác đây là chức năng tôi đã phát triển để có được URI của một thiết bị đầu cuối được đặt tên. Nó cũng tạo ra một danh sách các thiết bị đầu cuối sử dụng và tập tin cấu hình mà thực tế đã được sử dụng khi gỡ lỗi:

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