2009-05-07 36 views
10

Tôi có một dịch vụ WCF hoạt động ok nếu tôi tạo dịch vụ mà không chỉ định bất kỳ ràng buộc hoặc điểm cuối (nó đọc nó từ các giá trị được tạo ra trong App.config khi tôi đăng ký WCF thông qua Visual Studio).WCF: Làm thế nào tôi có thể lập trình tạo lại các giá trị App.config này?

Tôi có một phương pháp đơn giản mà trả về tài liệu tham khảo dịch vụ:

return new SmsServiceReference.SmsEngineServiceClient(); 

này hoạt động ok (vì các giá trị được đọc từ config). Tuy nhiên, tôi muốn có một số giá trị trong Cơ sở dữ liệu (ví dụ: URI) và muốn thực hiện một việc như sau:

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

Điều này không hiệu quả. Nó ném một ngoại lệ khi tôi cố gắng sử dụng tài liệu tham khảo dịch vụ.

Tôi nghi ngờ rằng điều này là do App.config của tôi có thêm thông tin mà hai dòng lên đó không cung cấp (rõ ràng). Câu hỏi là, làm thế nào tôi có thể tái tạo các giá trị App.Config sau đây theo chương trình?

Đây là đoạn của App.Config của tôi: (URI đã được thay đổi để bảo vệ người vô tội).

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

Trả lời

16

Hầu hết các giá trị trong cấu hình ứng dụng cũng là các thuộc tính trong ràng buộc và có thể được tạo lại theo chương trình. Cá nhân, tôi sử dụng một phương pháp như hình dưới đây để tạo ra các ràng buộc

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

Và tôi sử dụng một cái gì đó như thế này để tạo địa chỉ Endpoint tôi

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

Các serviceUri sẽ là URL dịch vụ như http://www.myuri.com/Services/Services.svc/basic

Cuối cùng để tạo ra các khách hàng dịch vụ

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

Điều này đã làm điều này. Cảm ơn. –

1

Vâng, thiết bị đầu cuối khách hàng trong cấu hình xác định URL này:

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

nhưng trong mẫu mã của bạn, bạn tạo:

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

Các địa chỉ phải trùng khớp - nếu một trong cấu hình hoạt động, bạn cần phải thay đổi mã của mình thành:

EndpointAddress endpointAddress = new EndpointAddress("http://www.myuri.com/Services/Services.svc/basic"); 

Nhớ bạn - có rất nhiều lỗi chính tả khác nhau trong mẫu mã của bạn (my.uri.com so với www.myuri.com, /service.svc thay vì /Services/Services.svc).

Tính năng này có hoạt động với địa chỉ điểm cuối đã sửa không?

Marc

+0

tôi xin lỗi fo r "lỗi chính tả", tôi chỉ cố gắng "đơn giản". Địa chỉ điểm cuối sử dụng trong mã (và trong cấu hình ứng dụng) là giống nhau, nhưng nó không hoạt động. Có một sự khác biệt, App.config có/điều cơ bản. Đó không phải là một phần của URI, dunno tại sao VSTUDIO thêm vào đó. Nếu bạn duyệt đến url đó (với/cơ bản) nó không hoạt động. Không cần phải nói, tôi đã thử cả hai.Tôi giả sử rằng tôi đang thiếu một cái gì đó trong sáng tạo "điểm cuối" của tôi rằng App.config có. Trong thực tế, tôi không cho điểm cuối của tôi bất kỳ tham số nhưng uri, những gì về tất cả các thông tin APp.config khác? –

+0

Chính tả chính xác của URL là rất quan trọng, vì vậy việc "đơn giản" ở đây dẫn đến nhầm lẫn. Bạn có thể hiển thị cho chúng tôi tệp cấu hình cho phần máy chủ không? –

+0

Xin chào marc, vấn đề không phải là URI, nhưng một số thông số tôi có trong web.config khách hàng của tôi mà tôi đã không đi qua để ràng buộc khi tạo nó theo chương trình. Tôi đã thông qua tất cả mọi thứ chính xác như nó đã được trong web.config (bằng cách sử dụng đề nghị của Emmanuel) và nó đã làm việc. Cảm ơn bạn đã giúp đỡ! +1 cho bạn –

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