Compartir a través de


Cómo publicar metadatos para un servicio mediante un archivo de configuración

Este es uno de los dos temas de instrucciones para la publicación de metadatos para un servicio de 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.

ms734765.Caution(es-es,VS.100).gifPrecaució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 los metadatos de forma segura, vea Extremo personalizado de metadatos seguros.

Para obtener más información sobre la publicación de metadatos mediante código, vea Publicación de 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 estar seguro de que el código funciona, cree un servicio básico de WCF. 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("https://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>.

    <behaviors>
    
    </behaviors>
    
  2. Dentro del elemento <behaviors>, agregue un nuevo elemento <serviceBehaviors>.

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

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
    
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  4. Agregue un elemento <serviceMetadata> al elemento <behavior>. Establecer el atributo httpGetEnabled en true y el atributo policyVersion en Policy15. httpGetEnabled permite al servicio responder a las solicitudes de metadatos realizadas por una solicitud HTTP GET. policyVersion indica al servicio que cumpla con WS-Policy 1.5 al generar los metadatos.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  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 extremos 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 extremos 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. Compile y ejecute la aplicación de consola.

  10. Utilice Internet Explorer para ir a la dirección base del servicio (https://localhost:8001/MetadataSample en este ejemplo) y comprobar que la publicación de los 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 extremos predeterminados

  1. Para configurar metadatos en un servicio que usa extremos predeterminados, especifique el ServiceMetadataBehavior en el archivo de configuración como en el ejemplo anterior, pero no especifique ningún extremo. 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 habilitada la publicación de metadatos, y como no se agregaron extremos de forma explícita, el tiempo de ejecución agrega los extremos predeterminados. Para obtener más información sobre los extremos, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Ejemplo

El siguiente ejemplo de código 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("https://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>

Vea también

Tareas

Hospedaje de un servicio WCF en una aplicación administrada
Autohospedaje
Publicación de metadatos para un servicio mediante código

Referencia

ServiceMetadataBehavior

Conceptos

Información general de la arquitectura de metadatos
Utilización de los metadatos