2009-10-22 13 views
7

Jakie jest zastosowanie i znaczenie IMetadataExchange w WCF?Jakie jest znaczenie IMetadataExchange w WCF?

Mam następujący plik app.config, w którym nie używam punktu końcowego IMetadataExchange, ale nadal mogę utworzyć klienta proxy. Przeczytałem, że jeśli nie używam punktu końcowego IMetadataExchange, AddServiceReference nie będzie działać, ponieważ moja usługa nie ujawnia metadanych. Jak działa bez narażania punktu końcowego?

<?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> 

Odpowiedz

7

IMetadataExchange Interface Udostępnia metody używane do zwracania metadanych dotyczących usługi. Podczas programowania usług Windows Communication Foundation (WCF), przydatne jest publikowanie metadanych dotyczących usługi. Na przykład metadane mogą być dokumentami WSDL (Web Services Description Language) opisującymi wszystkie metody i typy danych używane przez usługę. Zwracanie metadanych dotyczących usługi WCF umożliwia konsumentom usługi łatwe tworzenie klientów dla usługi.

12

ArsenMkrt ma formalną odpowiedź. Mówiąc prościej:

  • Jeśli go nie masz, dodając odniesienie usługa nie będzie działać
  • należy go usunąć z serwerów produkcyjnych, tak, że haker nie może dodać odwołanie usług

aby odpowiedzieć na to pytanie dokładniej, trzeba tę linię na usługi:

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

co wskazuje na tej konfiguracji

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

Może dlatego nadal działa, chociaż myślałem, że trzeba określić punkt końcowy MEX.

+1

+1 dokładnie - brak metadanych -> nie ma możliwości sprawdzenia, co oferuje usługa, w takim przypadku potrzebny jest "wstępnie przygotowany" klient proxy jako kod lub coś innego, aby połączyć się z usługą –

+0

+1 dla "• Należy usunąć go z serwerów produkcyjnych, aby haker nie mógł dodać odwołania do usługi" –

+0

Zapobieganie dodawaniu referencji serwisowej przez hakera NIE uniemożliwi hakerowi wywoływania/nadużywania/defraudacji usługi. – Mark

6

Różnica jest:

<serviceMetadata httpGetEnabled="true"/> 

umożliwia pobieranie metadanych za pomocą protokołu HTTP.

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

umożliwia pobieranie metadanych za pomocą protokołu ws-metadata.

Po prostu < serviceMetadata httpGetEnabled = "true" /> działa, ale nie wszyscy klienci mogą do ciebie zadzwonić (ponieważ nie mogą pobrać metadanych w celu utworzenia serwera proxy).

Standardem jest opublikowanie obu.

Zobacz także ServiceMetadataBehavior Class (MSDN).

+1

To jest świetna odpowiedź. Aby uzupełnić odpowiedź, zobacz ten link: https://msdn.microsoft.com/en-us/library/aa751951.aspx – Robotron

0

Bez IMetadataExchange, usługa WCF udostępnia dane metadanych klientowi, ale WCF nie gwarantuje ujawnienia metadanych, ponieważ domyślne funkcje WCF ujawniają metadane klientowi.

Ekspozycja metadanych odbywa się w sposób znormalizowany poprzez IMetadataExchange. Interfejs IMetadataExchange jest zgodny ze standardem branżowym.

Powiązane problemy