2009-10-22 12 views
7

¿Cuál es el uso y la importancia de IMetadataExchange en WCF?¿Cuál es la importancia de IMetadataExchange en WCF?

Tengo el siguiente archivo app.config en el que no uso el punto final IMetadataExchange, pero aún puedo crear mi cliente proxy. He leído que si no uso el punto final IMetadataExchange, AddServiceReference no funcionará porque mi servicio no expone los metadatos. ¿Cómo está funcionando sin exponer IMetadataExchange punto final?

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

Respuesta

7

IMetadataExchange Interface expone métodos utilizados para devolver metadatos acerca de un servicio. Al programar servicios de Windows Communication Foundation (WCF), es útil publicar metadatos sobre el servicio. Por ejemplo, los metadatos pueden ser documentos del lenguaje de descripción de servicios web (WSDL) que describen todos los métodos y tipos de datos empleados por un servicio. La devolución de metadatos sobre un servicio WCF permite a los consumidores de un servicio crear fácilmente clientes para el servicio.

12

ArsenMkrt tiene la respuesta formal. En términos más sencillos:

  • Si no lo tiene, añadiendo una referencia de servicio no funcionará
  • debe eliminarlo de servidores de producción, por lo que un hacker no puede agregar una referencia de servicio

para responder a su pregunta, más concretamente, tiene esta línea en su servicio:

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

que apunta a esta configuración

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

Puede que esta sea la razón por la que todavía funciona, aunque pensé que era necesario especificar el punto final MEX.

+1

+1 exactamente - sin metadatos -> no hay manera de descubrir qué ofrece el servicio, en ese caso, necesitará un cliente proxy "prefabricado" como código u otra cosa para conectarse al servicio –

+0

+1 para "• Debe eliminarlo de los servidores de producción, de modo que un pirata informático no pueda agregar la referencia de servicio" –

+0

. Evitar que un pirata informático agregue una referencia de servicio NO evitará que el pirata informático llame/abuse/defraude su servicio. – Mark

6

La diferencia es:

<serviceMetadata httpGetEnabled="true"/> 

le permite recuperar los metadatos utilizando el protocolo HTTP.

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

le permite recuperar metadatos utilizando el protocolo ws-metadata.

Solo < serviceMetadata httpGetEnabled = "true" /> funciona, pero no todos los clientes pueden llamarte (porque no pueden recuperar metadatos para crear un proxy).

El estándar es publicar ambos.

Véase también ServiceMetadataBehavior Class (MSDN).

+1

Esta es una gran respuesta. Para complementar la respuesta, consulte este enlace: https://msdn.microsoft.com/en-us/library/aa751951.aspx – Robotron

0

Sin IMetadataExchange, un servicio WCF expone la información de metadatos al cliente, pero WCF no garantiza exponer los metadatos porque las características predeterminadas de WCF para exponer los metadatos al cliente.

La exposición de los metadatos se realiza de forma estandarizada a través de IMetadataExchange. La interfaz IMetadataExchange sigue el estándar de la industria.

Cuestiones relacionadas