2011-01-25 35 views
23

Tôi đã viết một dịch vụ web WCF để sử dụng bởi ứng dụng Silverlight. Ban đầu, dịch vụ chỉ yêu cầu một liên kết http cơ bản. Bây giờ chúng ta cần có khả năng triển khai dịch vụ để sử dụng dưới cả http và https. Tôi đã tìm thấy một số cài đặt cho web.config cho phép tôi thực hiện việc này như sau:Triển khai Dịch vụ WCF với cả ràng buộc http/https và các điểm cuối

<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="SilverlightFaultBehavior"> 
     <silverlightFaults /> 
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="SecureHttpBinding"> 
     <security mode="Transport" /> 
     </binding> 
     <binding name="BasicHttpBinding"> 
     <security mode="None" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
</system.serviceModel> 

Thật không may, tuy nhiên, có vấn đề với điều này.

Dịch vụ web này cần được triển khai cho hàng trăm máy chủ của khách hàng của chúng tôi và không phải tất cả chúng đều sẽ sử dụng https. Triển khai nó vào một máy chủ mà không có một ràng buộc https thiết lập trong IIS làm cho nó thất bại. Có cách nào để có cả hai ràng buộc trong web.config theo mặc định mà không có nó chết nếu không có một ràng buộc https thiết lập trong IIS?

Chúng tôi có giải pháp khả thi cho vấn đề này, nhưng nó không thực sự phù hợp với yêu cầu triển khai của chúng tôi.

Có ai khác đã gặp phải bất kỳ điều gì như thế này trước đây không và cách bạn giải quyết nó?

+0

*** silverlightFaults *** là gì? – Kiquenet

Trả lời

5

Câu trả lời được chấp nhận trên trang này không được sử dụng nhiều nếu bạn không sử dụng trình cài đặt. Câu trả lời đúng nằm trong bản chỉnh sửa sau này của bản thân OP, tất cả những gì cần làm là liên kết cả hai cổng http và https trong IIS và sau đó sử dụng cấu hình bên dưới.

  <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
       <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 

Điều đó làm việc tốt cho tôi!

+0

Tại sao tôi thử điều này, tôi nhận được một ServiceActivationException. ... không thể kích hoạt do ngoại lệ trong quá trình biên dịch. Thông báo ngoại lệ là: Không thể thêm hai mục có cùng một khóa vào SynchronizedKeyedCollection .. ---> System.ArgumentException: Không thể thêm hai mục có cùng khóa vào SynchronizedKeyedCollection –

1

Hai trong số các điểm cuối của bạn có cùng URI. Điều này không được phép trong WCF. Bạn có thể chỉ định các điểm cuối bằng các ràng buộc khác nhau, nhưng URI phải khác nhau (nghĩa là số cổng khác nhau hoặc hợp đồng khác).

+1

Đó là những gì tôi nghĩ cho đến khi tôi cấu hình nó theo cách này chỉ để xem nó có hoạt động hay không, và vì lý do gì đó, có lẽ vì sự ràng buộc https trong IIS được thiết lập cho cổng 443. Điều duy nhất không làm t làm việc là cố gắng để có nó chạy trên một máy mà IIS không có một ràng buộc https thiết lập. – Zannjaminderson

+1

Bạn thực sự có thể có cùng địa chỉ trên nhiều điểm cuối vì lọc hợp đồng và phân biệt giữa địa chỉ điểm cuối và listenURI. Xem [Nhiều điểm cuối tại một ListenUri đơn] (http://msdn.microsoft.com/en-us/library/aa395210.aspx) để biết chi tiết. – BitMask777

+0

Tôi có _bindings_ ('(loại: tên máy chủ: cổng)') trong IIS: *** http: không có hostaname: 49759 ***, *** https: pre.company.es: 443 *** và ** * http: pre.company.es: 80 ***, VÀ ** URI ** của tôi **. *** baseaddress ***: _http: // preserver: 49759/vdir1/SilverlightServices/serv.svc_ và _https: //pre.company.es/vdir1/SilverlightServices/serv.svc_ Mà sẽ là địa chỉ ** *? – Kiquenet

4

Điều này sẽ được xử lý bởi trình cài đặt bạn sử dụng để triển khai dịch vụ. Nó phải là một điều kiện tiên quyết (hoặc ít nhất là để lại một tùy chọn trong trình cài đặt) để triển khai cả hai thiết bị đầu cuối hoặc chỉ các thiết bị đầu cuối http.

10

Cuối cùng, chúng tôi quyết định đi với các tập tin bên ngoài bằng cách sử dụng thuộc tính configSource cho các phần cam kết ràng buộc, hành vi, và các dịch vụ của web.config, như vậy:

<bindings configSource="bindings.config" /> 
<behaviors configSource="behaviors.config" /> 
<services configSource="services.config" /> 

Bằng cách này, chúng tôi triển khai nó theo mặc định với những tệp bên ngoài đó được thiết lập để chỉ truy cập http và cung cấp cho khách hàng hướng dẫn (hoặc hỗ trợ họ) về cách chỉnh sửa các tệp bên ngoài để thiết lập quyền truy cập https. Điều này cũng cho phép chúng tôi triển khai các thay đổi trong tương lai đối với web.config mà không ghi đè lên các tệp cấu hình bên ngoài.

+0

bạn đã thử bất kỳ giải pháp nào cho ràng buộc http và https chưa? bất kì *.cấu hình cho trường hợp http-https hoặc chỉ http? – Kiquenet

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