Procedimiento para publicar metadatos para un servicio mediante un archivo de configuración

Este es uno de los dos temas de procedimientos que muestran la publicación de metadatos para un servicio Windows Communication Foundation (WCF). Hay dos maneras de especificar cómo debería publicar metadatos un servicio: mediante un archivo de configuración y mediante código. En este tema se muestra cómo publicar metadatos para un servicio mediante un archivo de configuración.

Precaución

En este tema se muestra cómo publicar metadatos de forma no segura. Cualquier cliente puede recuperar los metadatos del servicio. Si el servicio necesita publicar metadatos de forma segura, consulte Punto de conexión de metadatos seguro personalizado.

Para obtener más información sobre la publicación de metadatos en código, consulte Procedimiento para publicar metadatos para un servicio mediante código. La publicación de metadatos permite a los clientes recuperar los metadatos mediante una solicitud GET WS-Transfer o mediante una solicitud HTTP/GET usando la cadena de solicitud ?wsdl. Para asegurarse de que el código funciona, cree un servicio WCF básico. Para simplificar, se proporciona un servicio autohospedado básico en el código siguiente.

using System;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
  
namespace Metadata.Samples  
{  
    [ServiceContract]  
    public interface ISimpleService  
    {  
        [OperationContract]  
        string SimpleMethod(string msg);  
    }  
  
    class SimpleService : ISimpleService  
    {  
        public string SimpleMethod(string msg)  
        {  
            Console.WriteLine("The caller passed in " + msg);  
            return "Hello " + msg;  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));
            try  
            {  
                // Open the service host to accept incoming calls  
                host.Open();  
  
                // The service can now be accessed.  
                Console.WriteLine("The service is ready.");  
                Console.WriteLine("Press <ENTER> to terminate service.");  
                Console.WriteLine();  
                Console.ReadLine();  
  
                // Close the ServiceHostBase to shutdown the service.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  

Este servicio es un servicio autohospedado que se configura usando un archivo de configuración. El archivo de configuración siguiente sirve de punto de partida.

<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Metadata.Example.SimpleService">  
        <endpoint address=""  
                  binding="basicHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
      </service>  
    </services>  
    <behaviors>  
  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Publicación de metadatos para un servicio WCF mediante un archivo de configuración

  1. Dentro del archivo App.config, después del elemento </services> de cierre, cree un elemento <behaviors>.

  2. En el elemento <behaviors>, agregue un elemento <serviceBehaviors>.

  3. Agregue un elemento <behavior> al elemento <serviceBehaviors> y especifique un valor para el atributo name del elemento <behavior>.

  4. Agregue un elemento <serviceMetadata> al elemento <behavior>. Establezca el atributo httpGetEnabled en true y el atributo policyVersion en Policy15. httpGetEnabled permite que el servicio responda a las solicitudes de metadatos realizadas por una solicitud HTTP GET. policyVersion indica al servicio que se ajuste a WS-Policy 1.5 al generar los metadatos.

  5. Agregue un atributo behaviorConfiguration al elemento <service> y especifique el atributo name del elemento <behavior> agregado en el paso 1, como se muestra en el siguiente código de ejemplo.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Agregue uno o varios elementos <endpoint> con el contrato establecido en IMetadataExchange, como se muestra en el código de ejemplo siguiente.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
    
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
    
        <endpoint address="mex"  
                  binding="mexHttpBinding"  
                  contract="IMetadataExchange" />  
      </service>  
    </services>  
    
  7. Para los puntos de conexión de metadatos agregados en el paso anterior, establezca el atributo binding en uno de los siguientes valores:

    • mexHttpBinding para la publicación HTTP.

    • mexHttpsBinding para la publicación HTTPS.

    • mexNamedPipeBinding para la publicación de la canalización con nombre.

    • mexTcpBinding para la publicación TCP.

  8. Para los puntos de conexión de metadatos agregados en un paso anterior, establezca la dirección en:

    • Una cadena vacía para utilizar la dirección base de la aplicación host como el punto de publicación si la dirección base es igual que el enlace de los metadatos.

    • Una dirección relativa si la aplicación host tiene una dirección base.

    • Una dirección absoluta.

  9. Compilación y ejecución de la aplicación de consola.

  10. Vaya a la dirección base del servicio (http://localhost:8001/MetadataSample en este ejemplo) y compruebe que la publicación de metadatos esté activada. Si no, un mensaje en la parte superior de la página resultante muestra: "La publicación de metadatos para este servicio está deshabilitad actualmente".

Para usar puntos de conexión predeterminados

  1. Para configurar metadatos en un servicio que usa puntos de conexión predeterminados, especifique el ServiceMetadataBehavior en el archivo de configuración como en el ejemplo anterior, pero no especifique ningún punto de conexión. El archivo de configuración debería tener el aspecto siguiente.

    <configuration>  
      <system.serviceModel>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="SimpleServiceBehavior">  
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
    
      </system.serviceModel>  
    </configuration>  
    

    Dado que el servicio tiene un ServiceMetadataBehavior con httpGetEnabled establecido en true, el servicio tiene metadatos de publicación habilitados y como no se agregó ningún punto de conexión explícitamente, el tiempo de ejecución agrega los puntos de conexión predeterminados. Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Ejemplo

En el siguiente ejemplo de código se muestra la implementación de un servicio WCF básico y el archivo de configuración que publica los metadatos del servicio.

using System;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
  
namespace Metadata.Samples  
{  
    [ServiceContract]  
    public interface ISimpleService  
    {  
        [OperationContract]  
        string SimpleMethod(string msg);  
    }  
  
    class SimpleService : ISimpleService  
    {  
        public string SimpleMethod(string msg)  
        {  
            Console.WriteLine("The caller passed in " + msg);  
            return "Hello " + msg;  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));
            try  
            {  
                // Open the service host to accept incoming calls  
                host.Open();  
  
                // The service can now be accessed.  
                Console.WriteLine("The service is ready.");  
                Console.WriteLine("Press <ENTER> to terminate service.");  
                Console.WriteLine();  
                Console.ReadLine();  
  
                // Close the ServiceHostBase to shutdown the service.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
          <serviceDebug includeExceptionDetailInFaults="False" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Consulte también