2009-10-22 12 views
7

Qual è l'uso e l'importanza di IMetadataExchange in WCF?Qual è l'importanza di IMetadataExchange in WCF?

Ho il seguente file app.config in cui non utilizzo l'endpoint IMetadataExchange, ma sono ancora in grado di creare il mio client proxy. Ho letto che se non utilizzo l'endpoint IMetadataExchange, AddServiceReference non funzionerà perché il mio servizio non espone i metadati. Come funziona senza esporre l'endpoint IMetadataExchange?

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

risposta

7

IMetadataExchange Interface espone i metodi utilizzati per restituire i metadati di un servizio. Quando si programmano i servizi di Windows Communication Foundation (WCF), è utile pubblicare i metadati relativi al servizio. Ad esempio, i metadati possono essere un documento WSDL (Web Services Description Language) che descrive tutti i metodi e i tipi di dati utilizzati da un servizio. La restituzione dei metadati relativi a un servizio WCF consente agli utenti di un servizio di creare facilmente client per il servizio.

12

ArsenMkrt ha la risposta formale. Più semplicemente:

  • Se non lo avete, l'aggiunta di un riferimento al servizio non funziona
  • è necessario eliminarlo dal server di produzione, in modo che un hacker non può aggiungere un riferimento al servizio

per rispondere alla tua domanda più specificamente, si dispone di questa linea sul vostro servizio:

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

che punta a questa configurazione

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

Questo potrebbe essere il motivo per cui funziona ancora, anche se ho pensato che fosse necessario specificare l'endpoint MEX.

+1

+1 - nessun metadata -> nessun modo per scoprire cosa offre il servizio, in tal caso, è necessario un client proxy "pre-creato" come codice o qualcos'altro per connettersi al servizio –

+0

+1 per "• Dovresti eliminarlo dai server di produzione, in modo che un hacker non possa aggiungere un riferimento al servizio" –

+0

Impedire ad un hacker di aggiungere un riferimento al servizio NON impedirà all'hacker di chiamare/abusare/frodare il tuo servizio. – Mark

6

La differenza è:

<serviceMetadata httpGetEnabled="true"/> 

consente di recuperare i metadati utilizzando il protocollo HTTP.

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

consente di recuperare i metadati utilizzando il protocollo ws-metadata.

Solo < serviceMetadata httpGetEnabled = "true" /> funziona, ma non tutti i client possono chiamarti (perché non possono recuperare i metadati per creare un proxy).

Lo standard è quello di pubblicare entrambi.

Vedere anche ServiceMetadataBehavior Class (MSDN).

+1

Questa è un'ottima risposta. Per completare la risposta, vedere questo collegamento: https://msdn.microsoft.com/en-us/library/aa751951.aspx – Robotron

0

Senza IMetadataExchange, un servizio WCF espone le informazioni sui metadati al client, ma WCF non garantisce l'esposizione dei metadati perché le funzioni di default di WCF per esporre i metadati al client.

L'esposizione dei metadati viene eseguita in modo ben standardizzato tramite IMetadataExchange. L'interfaccia IMetadataExchange segue lo standard del settore.

Problemi correlati