Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Toda la comunicación con un servicio de Windows Communication Foundation (WCF) se produce a través de los puntos de conexión del servicio. Los puntos de conexión proporcionan a los clientes acceso a la funcionalidad que ofrece un servicio WCF. En esta sección se describe la estructura de un punto de conexión y se describe cómo definir un punto de conexión en la configuración y en el código.
La estructura de un punto final
Cada punto de conexión contiene una dirección que indica dónde encontrar el punto de conexión, un enlace que especifica cómo un cliente puede comunicarse con el punto de conexión y un contrato que identifica los métodos disponibles.
Dirección. La dirección identifica de forma única el punto de conexión e indica a los consumidores potenciales dónde se encuentra el servicio. Se representa en el modelo de objetos WCF por la EndpointAddress dirección, 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 detallada adicional para identificar o interactuar con el punto de conexión. Para obtener más información, consulte Especificación de una dirección de punto de conexión.
Enlace. La vinculación especifica cómo comunicarse con el punto de conexión. El enlace especifica cómo se comunica el punto de conexión 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 Uso de enlaces para configurar servicios y clientes.
Contrato de servicio. El contrato de servicio describe qué funcionalidad expone el punto de conexión al cliente. Un contrato especifica las operaciones a las que un cliente puede llamar, la forma del mensaje y el tipo de parámetros o datos de entrada necesarios para llamar a la operación y el tipo de mensaje de procesamiento o respuesta que puede esperar el cliente. Tres tipos básicos de contratos corresponden a patrones básicos de intercambio de mensajes (MEP): datagrama (unidireccional), solicitud/respuesta y dúplex (bidireccional). El contrato de servicio también puede emplear contratos de datos y mensajes para requerir tipos de datos específicos y formatos de mensaje cuando se accede a ellos. Para obtener más información sobre cómo definir un contrato de servicio, consulte Diseño de contratos de servicio. 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 punto de conexión de un servicio se puede especificar de forma imperativa mediante código o mediante declaración a través de la configuración. Si no se especifica ningún punto de conexión, el tiempo de ejecución proporciona puntos de conexión predeterminados agregando un punto de conexión predeterminado para cada dirección base para cada contrato de servicio implementado por el servicio. La definición de puntos de conexión en el código no suele ser práctica porque los enlaces y direcciones de un servicio implementado suelen ser diferentes de los usados mientras se desarrolla el servicio. Por lo general, es más práctico definir puntos de conexión de servicio mediante la configuración en lugar de código. Mantener la información de enlace y direccionamiento fuera del código les permite cambiar sin tener que volver a compilar y volver a 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(Type, Type) para cargar correctamente el contrato en un nuevo objeto ServiceDescription.
Definición de puntos de conexión en código
En el ejemplo siguiente se muestra cómo especificar un punto de conexión en el código con lo siguiente:
Defina un contrato para un
IEcho
tipo de servicio que acepte el nombre de alguien y responda con el eco "Hola <nombre>!".Implemente un
Echo
servicio del tipo definido por elIEcho
contrato.Especifique una dirección de punto de conexión para el servicio
http://localhost:8000/Echo
.Configure el servicio
Echo
mediante un enlace WSHttpBinding.
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://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("http://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 de servicio se crea con una dirección base y, a continuación, el resto de la dirección, en relación con la dirección base, se especifica como parte de un punto de conexión. Esta creación de particiones de la dirección permite definir varios puntos de conexión de forma más cómoda para los servicios en un host.
Nota:
No se deben modificar las propiedades de ServiceDescription en la aplicación de servicio después del método OnOpening en ServiceHostBase. Algunos miembros, como la Credentials propiedad y los AddServiceEndpoint
métodos en ServiceHostBase y ServiceHost, lanzan una excepción si se modifican más allá de ese punto. Otros le 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 Credentials propiedad produce una excepción si se modifica más allá de ese punto. Los demás valores de descripción del cliente se pueden modificar sin errores, pero el resultado no está definido.
Tanto para el servicio como para el cliente, se recomienda modificar la descripción antes de llamar a Open.
Definición de puntos de conexión en configuración
Al crear una aplicación, a menudo quiere aplazar las decisiones al administrador que implementa la aplicación. Por ejemplo, a menudo no hay forma de saber con antelación qué será una dirección de servicio (un URI). En lugar de codificar de forma rígida una dirección, es preferible permitir que un administrador lo haga después de crear un servicio. Esta flexibilidad se logra mediante la configuración. Para obtener más información, consulte Configuración de servicios.
Nota:
Use la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) junto con el modificador /config:
nombredearchivo[,
nombredearchivo]
para crear archivos de configuración rápidamente.
Uso de puntos de conexión predeterminados
Si no se especifica ningún punto de conexión en el código o en la configuración, el tiempo de ejecución proporciona puntos de conexión predeterminados agregando un punto de conexión predeterminado para cada dirección base para cada contrato de servicio implementado por el servicio. La dirección base se puede especificar en el código o en la configuración, y los puntos de conexión predeterminados se agregan cuando se llama a Open() en el ServiceHost. Este ejemplo es el mismo ejemplo de la sección anterior, pero dado que no se especifica ningún punto de conexión, se agregan los puntos de conexión predeterminados.
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
public class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://localhost:8000/");
//Create a ServiceHost for the Echo service.
ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);
// Open the service host to run it. Default endpoints
// are added when the service is opened.
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("http://localhost:8000/")
' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()
Si se proporcionan de forma explícita los puntos de conexión, los puntos de conexión predeterminados se pueden agregar llamando a AddDefaultEndpoints en ServiceHost antes de llamar a Open. Para obtener más información sobre los puntos de conexión predeterminados, vea Configuración simplificada y Configuración simplificada para servicios WCF.