2009-10-22 48 views
7

Việc sử dụng và tầm quan trọng của IMetadataExchange trong WCF là gì?Tầm quan trọng của IMetadataExchange trong WCF là gì?

Tôi có tệp app.config sau trong đó tôi không sử dụng điểm cuối IMetadataExchange, nhưng tôi vẫn có thể tạo ứng dụng khách proxy của mình. Tôi đã đọc rằng nếu tôi không sử dụng điểm cuối IMetadataExchange, AddServiceReference sẽ không hoạt động vì dịch vụ của tôi không hiển thị siêu dữ liệu. Tính năng này hoạt động như thế nào mà không cần phơi bày IMetadataExchange điểm cuối?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="metaDataBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
      <service name ="WCFService.Services" behaviorConfiguration="metaDataBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8090/Services/"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="" binding="basicHttpBinding" contract="WCFService.IMathOperations"/> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

Trả lời

7

IMetadataExchange Interface Phơi bày các phương pháp được sử dụng để trả về siêu dữ liệu về dịch vụ. Khi lập trình các dịch vụ Windows Communication Foundation (WCF), việc xuất bản siêu dữ liệu về dịch vụ là hữu ích. Ví dụ, siêu dữ liệu có thể là tài liệu Ngôn ngữ Mô tả Dịch vụ Web (WSDL) mô tả tất cả các phương thức và kiểu dữ liệu được sử dụng bởi một dịch vụ. Trả về siêu dữ liệu về dịch vụ WCF cho phép người tiêu dùng dịch vụ dễ dàng tạo khách hàng cho dịch vụ.

12

ArsenMkrt có câu trả lời chính thức. Một cách đơn giản hơn:

  • Nếu bạn không có nó, thêm một tài liệu tham khảo dịch vụ này sẽ không hoạt động
  • Bạn nên xóa nó khỏi máy chủ sản xuất, vì vậy mà một hacker không thể thêm một tài liệu tham khảo phục vụ

để trả lời câu hỏi của bạn cụ thể hơn, bạn có dòng này trên dịch vụ của bạn:

 <service name ="WCFService.Services" behaviorConfiguration="metaDataBehavior"> 

nào trỏ tới cấu hình này

<behavior name="metaDataBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
    </behavior> 

Đây có thể là lý do tại sao nó vẫn hoạt động, mặc dù tôi nghĩ rằng bạn cần chỉ định điểm cuối MEX.

+1

+1 chính xác - không có siêu dữ liệu -> không có cách nào để khám phá những gì dịch vụ cung cấp, trong trường hợp đó, bạn sẽ cần một máy khách proxy "được tạo trước" làm mã hoặc một thứ khác để kết nối với dịch vụ –

+0

+1 "• Bạn nên xóa nó khỏi máy chủ sản xuất, để hacker không thể thêm tham chiếu dịch vụ" –

+0

Ngăn chặn tin tặc thêm tài liệu tham khảo dịch vụ sẽ KHÔNG ngăn hacker tấn công/lạm dụng/lừa đảo dịch vụ của bạn. – Mark

6

Sự khác biệt là:

<serviceMetadata httpGetEnabled="true"/> 

cho phép bạn lấy siêu dữ liệu bằng cách sử dụng giao thức HTTP.

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

cho phép bạn truy xuất siêu dữ liệu bằng giao thức siêu dữ liệu ws.

Chỉ cần < serviceMetadata httpGetEnabled = "true" /> hoạt động, nhưng không phải tất cả khách hàng đều có thể gọi cho bạn (vì họ không thể truy xuất siêu dữ liệu để tạo proxy).

Tiêu chuẩn là xuất bản cả hai.

Xem thêm ServiceMetadataBehavior Class (MSDN).

+1

Đây là một câu trả lời tuyệt vời. Để bổ sung cho câu trả lời, hãy xem liên kết này: https://msdn.microsoft.com/en-us/library/aa751951.aspx – Robotron

0

Nếu không có IMetadataExchange, dịch vụ WCF sẽ hiển thị thông tin siêu dữ liệu cho máy khách, nhưng WCF không đảm bảo hiển thị siêu dữ liệu vì các tính năng mặc định WCF để hiển thị siêu dữ liệu cho ứng dụng khách.

Hiển thị siêu dữ liệu được thực hiện theo cách được chuẩn hóa thông qua IMetadataExchange. Giao diện IMetadataExchange tuân theo chuẩn công nghiệp.

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