Compartir a través de


Comportamiento de publicación de metadatos

El ejemplo Metadata muestra cómo controlar las características de publicación de metadatos de un servicio. Para evitar la divulgación involuntaria de metadatos del servicio potencialmente confidenciales, la configuración predeterminada para los servicios de Windows Communication Foundation (WCF) deshabilita la publicación de metadatos. Este comportamiento es seguro de forma predeterminada, pero también quiere decir que no puede usar una herramienta de importación de metadatos (como Svcutil.exe) para compilar el código de cliente necesario para llamar al servicio, a menos que el comportamiento de publicación de metadatos del servicio se habilite explícitamente en la configuración.

Importante

Para mostrar más claridad, este ejemplo muestra cómo crear un punto de conexión de publicación de metadatos no se seguros. Estos puntos de conexión pueden estar disponibles para los consumidores anónimos no autenticados y debe tenerse cuidado antes de implementarlos para garantizar que la revelación pública de metadatos de un servicio sea la adecuada. Consulte Punto de conexión personalizado de metadatos seguro para ver un ejemplo que protege el punto de conexión de metadatos.

Este ejemplo se basa en el ejemplo Introducción, que implementa el contrato de servicio ICalculator. En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio.

Nota

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

Para que un servicio exponga los metadatos, se debe configurar ServiceMetadataBehavior en el servicio. Cuando este comportamiento está presente, puede publicar los metadatos configurando un extremo para exponer el contrato IMetadataExchange como una implementación de un protocolo WS-MetadataExchange (MEX). Para su comodidad, se ha proporcionado al contrato el nombre de configuración abreviado de "IMetadataExchange." Este ejemplo utiliza mexHttpBinding, que es un enlace estándar de conveniencia que es equivalente a wsHttpBinding con el modo de seguridad establecido en None. Se utiliza una dirección relativa de "mex" en el punto de conexión que, cuando se resuelve con los resultados de la dirección base de los servicios resulta en la dirección de punto de conexión http://localhost/servicemodelsamples/service.svc/mex. A continuación, se muestra la configuración del comportamiento:

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

A continuación, se muestra el punto de conexión de MEX.

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

Este ejemplo establece la propiedad HttpGetEnabled en true, que también expone los metadatos del servicio mediante HTTP GET. Para habilitar un punto de conexión de metadatos HTTP GET, el servicio debe tener una dirección base HTTP. Se utiliza ?wsdl de la cadena de consulta en la dirección base del servicio para tener acceso a los metadatos. Por ejemplo, para ver el código WSDL del servicio en un explorador web, usaría la dirección http://localhost/servicemodelsamples/service.svc?wsdl. De manera alternativa, puede usar este comportamiento para exponer metadatos sobre HTTPS estableciendo HttpsGetEnabled en true. Esto requiere una dirección base HTTPS.

Para acceder al punto de conexión MEX del servicio, use la utilidad de metadatos de ServiceModel (Svcutil.exe).

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

Esto genera un cliente basado en los metadatos del servicio.

Para acceder a los metadatos del servicio con HTTP GET, ponga http://localhost/servicemodelsamples/service.svc?wsdl en el explorador.

Si quita este comportamiento e intenta abrir el servicio, obtendrá una excepción. Este error se produce porque sin el comportamiento, el extremo configurado con el contrato IMetadataExchange no tiene ninguna implementación.

Si establece HttpGetEnabled en false, ve la página de ayuda de CalculatorService en lugar de ver los metadatos del servicio.

Configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.

  3. Para ejecutar el ejemplo en una configuración de una sola máquina o de varias máquinas, siga las instrucciones que se indican en Ejecución de los ejemplos de Windows Communication Foundation.