2011-10-07 35 views
21

Tôi đang viết một ứng dụng khách cho dịch vụ WCF. Đây là một ứng dụng duy nhất trong một hệ thống lớn hơn bao gồm các mô-đun được viết bằng C#, C++, VB và Java. Tất cả các ứng dụng đều có chung cấu hình và cơ chế ghi nhật ký, bất kể chúng được viết bằng ngôn ngữ nào..NET - triển khai ứng dụng khách WCF, không có app.config

Tôi muốn tìm hiểu cách xây dựng ứng dụng khách để ứng dụng chạy mà không có app.config. Tại sao? Bởi vì hầu hết những gì trong app.config là boilerplate rằng sysadmins không nên được phép thay đổi, và những thiết lập nào thì sysadmins nên được phép thay đổi nên ở trong cấu hình toàn hệ thống, chứ không phải trong tệp app.config ngồi trong thư mục bin.

Trường hợp tại điểm - app.config của khách hàng hiện nay trông như thế này:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="WSHttpBinding_ICourierService"> 
      <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation" 
      ... 
      </security> 
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
      messageVersion="Default" writeEncoding="utf-8"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <httpTransport manualAddressing="false" 
      ... 
      useDefaultWebProxy="true" /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:57102/MyService.svc" 
     ... 
     > 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Đó là một loạt các soạn sẵn đục rằng quản trị hệ thống không cần phải giải quyết. Hầu hết nó đã được chèn bởi Visual Studio. Tôi đã thực hiện một thay đổi trong tệp - tôi đã tăng kích thước tối đa trong <readerQuotas/>. Nhưng đó là một sự thay đổi mà tôi không muốn các sysadmins gây rối. Và không có gì khác trong tập tin tôi muốn các sysadmins gây rối với ngoại trừ <endpoint address=""/>.

Và tôi đang kéo địa chỉ điểm cuối từ cấu hình trên toàn hệ thống và đặt nó trong mã. Không có gì trong tệp này nên người dùng có thể chỉnh sửa.

Vì vậy, làm cách nào để định cấu hình mọi thứ để tôi không cần phải có nó?

Tôi có thể nhúng nó làm tài nguyên trong hội đồng và móc vào quy trình tải app.config, cách tôi thực hiện với các DLL bắt buộc không?

Là lựa chọn duy nhất để tạo mã để định cấu hình mọi thứ, cách tôi đang sử dụng mã để đặt địa chỉ điểm cuối? Tạo các ràng buộc cần thiết, vv, trong mã? Làm thế nào, sau đó, tôi có biết mã nào để viết, cho các đoạn mã XML mờ đục này không?

+0

Tôi nghĩ SysAdmins có thể thay đổi những thứ như cài đặt dịch vụ WCF, ngớ ngẩn cho tôi. – ChrisBint

+1

Loại cài đặt nào? URL? Chắc chắn rồi. Bindings? Tại sao? Tôi đang xây dựng một khách hàng để nói chuyện với một dịch vụ đang chạy trên IIS. Không cần phải cho phép các hệ thống quản trị thay đổi ràng buộc thành một thứ gì đó ngoài HTTP. –

+0

Làm thế nào về tên máy chủ và bất cứ điều gì để làm với thực sự nói chuyện với dịch vụ. – ChrisBint

Trả lời

36

Bạn có thể sử dụng mã sau đây để tạo các ràng buộc mà cấu hình đang làm. Tôi không chắc chắn liệu điều đó có cho phép bạn xóa tệp hoàn toàn hay không nhưng ứng dụng sẽ không sử dụng cấu hình nếu đây là trường hợp. Đặt các giá trị của riêng bạn vào thời gian chờ, v.v.

var binding = new WSHttpBinding(); 
    binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.MaxReceivedMessageSize = 10000; 
    binding.ReaderQuotas.MaxStringContentLength = 10000; 
    binding.ReaderQuotas.MaxDepth = 10000; 
    binding.ReaderQuotas.MaxArrayLength = 10000; 
    var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc"); 
    var myClient = new WebServiceclient(binding, endpoint); 
+1

Tôi đang cố gắng điều đó, nhưng tôi gặp lỗi: "Không thể xử lý thư vì loại nội dung 'text/xml; charset = utf-8' không phải là kiểu mong đợi 'application/soap + xml; charset = utf -8 '" –

+4

Thử thay đổi đường liên kết tạo thành: var binding = new BasicHttpBinding(); – Graymatter

+0

nơi bạn sẽ đặt mã này chính xác, global.asax? kiểm tra đơn vị? – PositiveGuy

-1

Cài đặt WCF có thể được đặt trong mã của bạn, không cần tệp cấu hình bên ngoài. Địa chỉ, ràng buộc, điểm cuối, bảo mật, v.v. tất cả có thể được cấu hình trong mã. Đây là cách tốt nhất để nhất quán trên tất cả các dịch vụ WCF của bạn và không cho phép người dùng giả mạo các cài đặt này.

Tôi khuyên bạn nên để địa chỉ (tên máy chủ và số cổng) cho người dùng và cho phép họ định cấu hình bằng cách nào đó vì địa chỉ cụ thể cho nơi lưu trữ các dịch vụ WCF của bạn.

+3

Rằng chúng có thể được đặt trong mã của tôi không có nghĩa là dễ dàng tìm ra cách đặt chúng trong mã của tôi. –

+0

Bạn có một vài tùy chọn để tìm ra cách thiết lập các cài đặt WCF trong mã của bạn: (1) Duyệt qua các trang MSDN liên quan. (2) Nhận một cuốn sách hay về WCF, chẳng hạn như _Programing WCF Services_. (3) Xem câu hỏi [this] (http://stackoverflow.com/questions/54579/wcf-configuration-without-a-config-file) để được hướng dẫn. – Bernard

+0

ở đâu trong mã, tệp gì, global.asax? – PositiveGuy

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