2011-09-02 25 views
20

tôi đã tự hỏi tại sao tôi cần phải tuyên bố này:Tại sao tôi cần cả điểm cuối mex và httpGetEnable?

<serviceMetadata httpGetEnabled="true" /> 

và cũng này

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

Nếu tôi chỉ sử dụng đầu tiên một - nó đang làm việc thông qua trình duyệt. vậy tại sao tôi cần thứ hai?

Bạn có thể cho tôi ví dụ về tình huống mà tôi sẽ phải sử dụng sau không?

+2

Câu hỏi hay.+1 – Lijo

Trả lời

18

Bạn cần phải

  • kích hoạt dịch vụ công bố siêu dữ liệu ở tất cả (đó là serviceMetadata hành vi) - nhưng bạn không cần các httpGetEnabled - đó là tùy chọn

  • có một vị trí (điểm cuối), nơi một khách hàng truy vấn có thể lấy lấy siêu dữ liệu dịch vụ đó - đó là điểm cuối MEX. Đây là định dạng siêu dữ liệu có thể đọc được của máy - một trong đó Visual Studio hoặc svcutil có thể sử dụng để tạo ứng dụng khách. Nó không có ý định cho con người

+0

nhưng anh ấy có thể làm điều đó mà không có điểm cuối mex, có nghĩa là bởi wsdl ... vậy? –

+0

Nếu tôi bỏ qua "mex endoint" - "svcutil" sẽ không thể lấy nó? –

+0

@ mid787: bạn có vẻ đúng - với '' tại chỗ, bạn (và 'svcutil' cũng vậy) có thể lấy WSDL từ URL mà không có bất kỳ điểm cuối MEX nào - vì vậy bạn có thể thực sự không cần điều đó, miễn là dịch vụ của bạn xuất bản công khai WSDL –

7

này có vẻ là hữu ích trong tình huống sau đây ...

<system.serviceModel> 
    <services> 
     <service name="WCFService.Service" behaviorConfiguration="ServiceBehavior"> 
      <host> 
       <baseAddresses> 
        <add baseAddress="net.tcp://localhost:8080/WCFService"/> 
       </baseAddresses> 
      </host> 

      <!-- Net.Tcp EndPoints--> 
      <endpoint address="" 
       binding="netTcpBinding" 
       contract="WCFService.IService" /> 

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

      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="ServiceBehavior"> 
        <serviceMetadata httpGetEnabled="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
</system.serviceModel> 

Không có điểm cuối HTTP xác định và bạn có thể nhận được dịch vụ của bạn theo những cách sau. ..

- Browser: http://localhost/WCFService/Service.svc  
- svcutil.exe net.tcp://localhost:8080/WCFService/Service.svc/mex 

Nếu bạn nhận xét thì điểm cuối MEX sẽ không hoạt động.

Bạn tự hỏi tại sao các dữ liệu meta vẫn có thể được nhìn thấy trong các trình duyệt như

a) Tôi không có một thiết bị đầu cuối HTTP và b) Tôi đã thiết lập đặc biệt ...

<serviceMetadata httpGetEnabled="false" /> 

Lý do cho điều này là trong cài đặt nâng cao cho trang web tôi đã xác định sau cho Giao thức đã bật trong Cài đặt nâng cao ...

http,net.tcp

Nếu bạn xóa http thì siêu dữ liệu không thể thấy trong trình duyệt. Có vẻ như trong kịch bản này, một trang web chỉ hỗ trợ net.tcp, bạn cần điểm cuối mex.

1

Điểm cuối MEX là điểm cuối đặc biệt cho phép khách hàng nhận siêu dữ liệu của dịch vụ bằng cách sử dụng thông báo SOAP thay vì http nhận yêu cầu. Bạn có thể tạo điểm cuối MEX có thể được truy cập thông qua http, https, tcp và thậm chí cả các đường ống được đặt tên.

Phản hồi mà bạn sẽ nhận được khi gọi một hoạt động GetMetadata của điểm cuối của MEX sẽ bao gồm nội dung của WSDL và tất cả các tệp XSD được liên kết với nó.

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