Share via


Información general acerca de la creación de puntos finales

Toda la comunicación con un servicio Windows Communication Foundation (WCF) se produce a través de los extremos del servicio. Los extremos proporcionan a los clientes acceso a la funcionalidad que ofrece un servicio WCF. Esta sección describe la estructura de un extremo, y detalla cómo definir un extremo en la configuración y el código.

Estructura de un extremo

Cada extremo contiene una dirección que indica dónde se encuentra el extremo, un enlace que especifica cómo puede comunicarse un cliente con el extremo, y un contrato que identifica los métodos disponibles.

  • Dirección. La dirección identifica únicamente el extremo e indica a los consumidores potenciales dónde se ubica el servicio. En el modelo de objeto WCF está representada por la dirección EndpointAddress, que contiene un Identificador uniforme de recursos (URI) y propiedades de dirección que incluyen una identidad, algunos elementos del lenguaje de descripción de servicios web (WSDL), y una colección de encabezados opcionales. Los encabezados opcionales proporcionan información de direccionamiento adicional para identificar o interactuar con el extremo. Para obtener más información, consulte Especificación de una dirección de extremo.
  • Enlace. El enlace especifica cómo comunicarse con el extremo. También especifica cómo se comunica el extremo con el mundo, incluido el protocolo de transporte que utiliza (por ejemplo, TCP o HTTP), la codificación utilizada en los mensajes (por ejemplo, texto o binario) y los requisitos de seguridad necesarios (por ejemplo, capa de sockets seguros [SSL] o seguridad del mensaje SOAP). Para obtener más información, consulte Utilización de enlaces para configurar servicios y clientes.
  • Contrato de servicios. El contrato de servicios describe qué funcionalidad expone el extremo al cliente. Un contrato especifica las operaciones a las que puede llamar un cliente, la forma del mensaje y el tipo de parámetros de entrada o los datos necesarios para llamar a la operación, así como el tipo de mensaje de procesamiento o respuesta que puede esperar el cliente. Existen tres tipos básicos de contratos que se corresponden con los modelos de intercambio de mensajes básicos (MEP): datagrama (unidireccional), solicitud/respuesta y dúplex (bidireccional). El contrato de servicios también puede utilizar contratos de datos y mensajes para exigir tipos de datos y formatos de mensaje específicos cuando se obtiene acceso. Para obtener más información acerca de cómo definir un contrato de servicios, vea Diseño de contratos de servicios. Tenga en cuenta que también pueden exigírsele a un cliente que implemente un contrato definido por servicio, denominado un contrato de devolución de llamada, para recibir los mensajes del servicio en un MEP dúplex. Para obtener más información, consulte Servicios dúplex.

El extremo de un servicio puede especificarse de manera imperativa, mediante el código, o de manera declarativa a través de la configuración. Normalmente, no resulta muy práctico definir los extremos en el código ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Generalmente, es más práctico definir extremos de servicio mediante la configuración en lugar del código. Mantener la información del enlace y el direccionamiento fuera del código permite cambiar los extremos sin tener que volver a compilar e implementar la aplicación.

Nota

Cuando se agrega un extremo de servicio que realiza la suplantación, debe utilizarse uno de los métodos AddServiceEndpoint, o el método GetContract para cargar correctamente el contrato en un nuevo objeto ServiceDescription.

Definir los extremos en código

El siguiente ejemplo muestra cómo especificar un extremo en código:

  • Defina un contrato para un tipo de servicio IEcho que acepta el nombre de alguien y responde con un mensaje de eco "Hola <nombre>! ".
  • Implemente un servicio Echo del tipo definido por el contrato IEcho.
  • Especifique una dirección de extremo de https://localhost:8000/Echo para el servicio.
  • Configure el servicio Echo mediante un enlace WSHttpBinding.
Namespace Echo
{
   // Define the contract for the IEcho service 
   [ServiceContract]
   Interface IEchoWorld
   {
   [OperationContract]
   String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   Class Echo:IEcho
   {
      Public string Hello(string name)
         {
      Return "Hello" + name + "!";
         }
      static void Main ()
      {
      //Specify the base address for Echo service.
      Uri echoUri = new Uri("https://localhost:8000/");

      //Create a ServiceHost for the Echo service.
      ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

      // Use a predefined WSHttpBinding to configure the service.
      WSHttpBinding binding = new WSHttpBinding();

      // Add the endpoint for this service to the service host.
      serviceHost.AddServiceEndpoint(
         typeof(IEcho), 
         binding, 
         echoUri
       );

      // Open the service host to run it.
      serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo 
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("https://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

Nota

El host del servicio se crea con una dirección base y, a continuación, se especifica el resto de la dirección, relacionada con la dirección base, como parte de un extremo. Esta subdivisión de la dirección permite definir varios extremos de manera más conveniente para los servicios de un host.

Nota

Las propiedades de ServiceDescription en la aplicación de servicio no deben modificarse después del método OnOpening en ServiceHostBase. Algunos miembros, como la propiedad Credentials y los métodos AddServiceEndpoint en ServiceHostBase y ServiceHost, inician una excepción si se modifican pasado ese punto. Otros permiten modificarlos, pero el resultado no está definido.

De igual forma, en el cliente no se deben modificar los valores ServiceEndpoint después de la llamada a OnOpening en ChannelFactory. La propiedad Credentials inicia una excepción si se modifican pasado ese punto. Los otros valores de descripción del cliente pueden modificarse sin el error, pero el resultado no está definido.

Tanto si es para el servicio como para el cliente, se recomienda modificar la descripción antes de llamar a Open.

Definir los extremos en configuración

Con frecuencia al crear una aplicación se desea delegar las decisiones al administrador que está implementando la aplicación. Por ejemplo, es habitual que no pueda saberse de antemano cuál será la dirección de servicio (una URI). En lugar de incluir una dirección en el código, es preferible permitir a un administrador hacerlo después de crear un servicio. Esta flexibilidad se logra a través de la configuración. Para obtener información, vea Configuración de servicios.

Nota

Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) con el modificador /config:nombre de archivo[,nombre de archivo] para crear rápidamente archivos de configuración.

Consulte también

Conceptos

Implementación de contratos de servicio