2009-06-17 35 views
11

Tìm cách tạo một Ứng dụng khách gửi các đối tượng Tin nhắn được tuần tự trở lại máy chủ qua WCF.Cấu hình máy khách WCF: làm thế nào tôi có thể kiểm tra xem điểm cuối có trong tệp cấu hình và dự phòng mã nếu không?

Để làm cho mọi việc dễ dàng cho nhà phát triển cuối (các phòng ban khác nhau) sẽ tốt nhất là họ không cần biết cách chỉnh sửa tệp cấu hình của họ để thiết lập dữ liệu điểm cuối của khách hàng.

Điều đó nói rằng, cũng sẽ tuyệt vời khi điểm cuối không được nhúng/mã hóa cứng vào Ứng dụng khách.

Một kịch bản mix sẽ xuất hiện với tôi là giải pháp đơn giản nhất để tung ra:

IF (được mô tả trong config) SỬ DỤNG tập tin cấu hình dự phòng khác để endpoint mã hóa cứng.

Những gì tôi đã phát hiện ra là:

  1. new Client(); thất bại nếu không có định nghĩa tập tin cấu hình được tìm thấy.
  2. new Client(binding,endpoint); làm việc

do đó:

Client client; 
try { 
    client = new Client(); 
}catch { 
    //Guess not defined in config file... 
    //fall back to hard coded solution: 
    client(binding, endpoint) 
} 

Nhưng có cách nào để kiểm tra (trừ try/catch) để xem tập tin cấu hình đã một endpoint tuyên bố?

Điều trên cũng không thất bại nếu được xác định trong tệp cấu hình, nhưng chưa được định cấu hình đúng không? Sẽ là tốt để phân biệt giữa hai điều kiện?

Trả lời

7

đây là cách để đọc các tập tin cấu hình và nạp dữ liệu vào một cách dễ dàng để quản lý đối tượng:

Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigurationSectionGroup csg = c.GetSectionGroup("system.serviceModel"); 
if (csg != null) 
{ 
    ConfigurationSection css = csg.Sections["client"]; 
    if (css != null && css is ClientSection) 
    { 
     ClientSection cs = (ClientSection)csg.Sections["client"]; 
     //make all your tests about the correcteness of the endpoints here 
    } 
} 

Các "cs" đối tượng sẽ phơi bày một bộ sưu tập có tên là "điểm cuối" cho phép bạn truy cập tất cả các thuộc tính mà bạn tìm thấy trong tệp cấu hình.

Đảm bảo bạn cũng xử lý các nhánh "khác" của "if" và coi chúng là trường hợp không thành công (cấu hình không hợp lệ).

+0

Cảm ơn Alex đã tìm ra giải pháp. (Wish MS sẽ thêm các loại phương pháp này vào khung chính nó.) –

+0

Vấn đề (đối với tôi) với cách tiếp cận của Alex là Silverlight dường như không có System.Configuration DLL ... :(Vì vậy, bạn có thể ' t đọc clientconfig một cách dễ dàng bất cứ ai có bất kỳ ý tưởng về làm thế nào để làm điều này trong Silverlight,/không có/hardwiring thứ vào mã cám ơn trước –

10

Tôi muốn đề xuất phiên bản cải tiến của giải pháp AlexDrenea, chỉ sử dụng các loại đặc biệt cho phần cấu hình.

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(configuration); 
     if (serviceModelGroup != null) 
     { 
      ClientSection clientSection = serviceModelGroup.Client; 
      //make all your tests about the correcteness of the endpoints here 

     } 
+1

1 đẹp LINQified:.?!. if (serviceModelGroup! = null && serviceModelGroup .Client.Endpoints.Cast () .Tất cả (e => e.Contract == "Services.IContract")) sử dụng (var contract = new ContractClient()) { } người khác sử dụng bình thường –

Các vấn đề liên quan