2011-01-10 41 views
13

Tôi đã tạo và thử nghiệm dịch vụ WCF, mọi thứ hoạt động tốt.Dịch vụ WCF trong môi trường https

Khi tôi triển khai để kiểm tra môi trường và cố gắng để mở https://my.site/myapp/EnrollmentService.svc Tôi đã có thông báo lỗi:

Không thể tìm thấy một địa chỉ cơ sở mà trận chương trình http cho endpoint với ràng buộc MetadataExchangeHttpBinding. Đề án địa chỉ cơ sở đã đăng ký là [https].

Internet chỉ cho tôi rằng tôi cần phải thêm một số tùy chọn cấu hình hơn:

http://www.codeproject.com/KB/WCF/7stepsWCF.aspx

Tôi đã thêm một số cài đặt để phục vụ tập tin web.config. Bây giờ nó trông giống như sau:

<system.serviceModel> 
<services> 
    <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior"> 
    <endpoint 
     address="https://my.site/myapp/EnrollmentService.svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="TransportSecurity" 
     contract="McActivationApp.IEnrollmentService"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="McActivationApp.IEnrollmentService" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="McActivationApp.EnrollmentServicBehavior"> 
     <serviceMetadata httpGetEnabled="True"/> 
     <serviceDebug includeExceptionDetailInFaults="False" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <basicHttpBinding> 
    <binding name="TransportSecurity"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

Thực ra, tôi đã thêm phần "ràng buộc" và chỉ định nó cho điểm cuối của tôi.

Nhưng điều này không thay đổi gì cả ...

Hãy thông báo, tôi cần làm gì. Cảm ơn rất nhiều!

P.S. Có bất kỳ sự khác biệt nào trong dịch vụ WCF tiêu thụ từ tài nguyên https và http không?

Trả lời

19

Khi bạn chỉ muốn hiển thị dịch vụ của mình qua HTTPS (trang web không hỗ trợ HTTP), bạn không thể sử dụng bất kỳ thứ gì phụ thuộc vào HTTP. Cấu hình hiện tại của bạn hiển thị trang trợ giúp trên HTTP và cũng có thể kết thúc mex (với hợp đồng sai) trên HTTP. Vì vậy, hãy thử điều này:

<system.serviceModel> 
    <services> 
    <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">  
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" contract="McActivationApp.IEnrollmentService"/>  
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors>  
     <behavior name="McActivationApp.EnrollmentServicBehavior">   
     <serviceMetadata httpsGetEnabled="True"/>  
     <serviceDebug includeExceptionDetailInFaults="False" />  
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding>  
     <binding name="TransportSecurity">  
     <security mode="Transport">   
      <transport clientCredentialType="None" />  
     </security>  
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />  
</system.serviceModel> 
+1

Tôi đã hiểu chính xác rằng ở đây bạn: 1) thay đổi mex ràng buộc từ mexHttpBinding thành mexHttpsBinding và 2) thay thế httpGetEnabled bằng httpsGetEnabled. cũng có tác dụng. Cảm ơn – Budda

+1

Vâng đó là những gì tôi đã làm + thay đổi hợp đồng cho mex và bị xóa địa chỉ của điểm đầu cuối vì nó không được sử dụng khi dịch vụ được lưu trữ trong IIS. –

+0

Cảm ơn sự giúp đỡ của bạn! – Budda

1

Để khắc phục vấn đề này bằng cách cho phép HTTP, bạn cần phải thêm một http ràng buộc trong IIS:

  1. Navigate to trang web của bạn trong IIS
  2. Bấm 'Bindings ...' trong các action panel trên bên phải.
  3. Nhấp vào 'Thêm'
  4. Chọn 'http' và OK.

Ngoài ra, bạn có thể ngăn chặn các vấn đề bằng cách hoặc là xóa dòng, hoặc thay đổi:

<serviceMetadata httpGetEnabled="True"/> 

tới:

<serviceMetadata httpsGetEnabled="True"/> 
+0

Tuyệt vời! Cảm ơn rất nhiều! – Budda

+0

... nhưng ... sau thay đổi đó, trang web bắt đầu hoạt động dưới 'http' thông thường không được phép ... – Budda

5

Bạn đã có http siêu dữ liệu thiết bị đầu cuối mà nên được thay đổi để https như sau.

<serviceMetadata httpsGetEnabled="True"/> 

Ngoài ra nếu không cần thiết, bạn nên loại bỏ điểm cuối mex và https siêu dữ liệu khỏi sản xuất theo cách tốt nhất.

+1

Tôi có hiểu chính xác rằng tôi cần thêm điều đó vào ' "? Vì vậy, tôi có thể xóa ràng buộc cho http cho trường hợp đó không? Nếu thêm thuộc tính này và xóa ràng buộc' serviceMetadata 'thì tôi đã nhận được cùng một thông báo lỗi hay không .. Vui lòng thông báo – Budda

+0

Điều tôi cũng cần thay đổi là xóa (chú ý: tên thuộc tính không chứa 's') và để xóa 'mex' endpoint ... – Budda

+0

Đây là ý tôi, thay đổi từ httpGetEnabled thành httpsGetEnabled – softveda

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