Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Toda a comunicação com o serviço Windows Communication Foundation (WCF) ocorre através dos pontos de extremidade do serviço. Os endpoints fornecem aos clientes acesso à funcionalidade oferecida por um serviço WCF. Esta seção descreve a estrutura de um ponto de extremidade e descreve como definir um ponto de extremidade na configuração e no código.
A estrutura de um ponto final
Cada ponto de extremidade contém um endereço que indica onde encontrar o ponto de extremidade, uma associação que especifica como um cliente pode se comunicar com o ponto de extremidade e um contrato que identifica os métodos disponíveis.
Endereço. O endereço identifica exclusivamente o ponto de extremidade e informa aos potenciais consumidores onde o serviço está localizado. Ele é representado no modelo de objeto WCF pelo EndpointAddress endereço, que contém um URI (Uniform Resource Identifier) e propriedades de endereço que incluem uma identidade, alguns elementos WSDL (Web Services Description Language) e uma coleção de cabeçalhos opcionais. Os cabeçalhos opcionais fornecem informações de endereçamento adicionais e detalhadas para identificar ou interagir com o endpoint. Para obter mais informações, consulte Especificando um endereço de endpoint.
Vinculação. A ligação especifica como comunicar-se com o ponto de extremidade. A associação especifica como o ponto de extremidade se comunica com o mundo, incluindo qual protocolo de transporte usar (por exemplo, TCP ou HTTP), qual codificação usar para as mensagens (por exemplo, texto ou binário) e quais requisitos de segurança são necessários (por exemplo, Secure Sockets Layer [SSL] ou segurança de mensagem SOAP). Para obter mais informações, consulte Usando Bindings para Configurar Serviços e Clientes.
Contrato de prestação de serviços. O contrato de serviço descreve qual funcionalidade o ponto de extremidade expõe ao cliente. Um contrato especifica as operações que um cliente pode chamar, a forma da mensagem e o tipo de parâmetros de entrada ou dados necessários para chamar a operação, e o tipo de processamento ou mensagem de resposta que o cliente pode esperar. Três tipos básicos de contratos correspondem a padrões básicos de troca de mensagens (MEPs): datagrama (unidirecional), solicitação/resposta e duplex (bidirecional). O contrato de serviço também pode empregar contratos de dados e mensagens para exigir tipos de dados e formatos de mensagem específicos ao ser acessado. Para obter mais informações sobre como definir um contrato de serviço, consulte Projetando contratos de serviço. Note-se que poderá também ser necessário que um cliente implemente um contrato definido pelo serviço, chamado contrato de callback, para receber mensagens do serviço num MEP em duplex. Para obter mais informações, consulte Serviços Duplex.
O ponto de extremidade de um serviço pode ser especificado imperativamente usando código ou declarativamente por meio de configuração. Se nenhum ponto de extremidade for especificado, o tempo de execução fornecerá pontos de extremidade padrão adicionando um ponto de extremidade padrão para cada endereço base para cada contrato de serviço implementado pelo serviço. Definir pontos de extremidade no código geralmente não é prático porque as ligações e endereços para um serviço implantado geralmente são diferentes daqueles usados enquanto o serviço está sendo desenvolvido. Geralmente, é mais prático definir pontos de extremidade de serviço usando configuração em vez de código. Manter as informações de vinculação e endereçamento fora do código permite que eles sejam alterados sem ter que recompilar e reimplantar o aplicativo.
Observação
Ao adicionar um endpoint de serviço que executa a impersonação, deve utilizar um dos métodos AddServiceEndpoint ou o método GetContract(Type, Type) para carregar corretamente o contrato num novo objeto ServiceDescription.
Definindo pontos terminais no código
O exemplo a seguir ilustra como especificar um ponto de extremidade no código com o seguinte:
Defina um contrato para um
IEchotipo de serviço que aceite o nome de alguém e ecoe com a resposta "Olá <nome>!".Implementar um
Echoserviço do tipo definido peloIEchocontrato.Especifique um endereço de ponto de extremidade de
http://localhost:8000/Echopara o serviço.Configure o
Echoserviço usando uma WSHttpBinding associação.
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()
Observação
O host de serviço é criado com um endereço base e, em seguida, o restante do endereço, relativo ao endereço base, é especificado como parte de um ponto de extremidade. Esse particionamento do endereço permite que vários pontos de extremidade sejam definidos de forma mais conveniente para serviços em um host.
Observação
As propriedades de ServiceDescription na aplicação de serviço não devem ser modificadas após o método OnOpening em ServiceHostBase. Alguns membros, como a propriedade Credentials e os métodos AddServiceEndpoint em ServiceHostBase e ServiceHost, geram uma exceção se forem modificados após esse ponto. Outros permitem modificá-los, mas o resultado é indefinido.
Da mesma forma, no cliente os ServiceEndpoint valores não devem ser modificados após a chamada para OnOpening no ChannelFactory. A Credentials propriedade lança uma exceção se modificada após esse ponto. Os outros valores de descrição do cliente podem ser modificados sem erro, mas o resultado é indefinido.
Seja para o serviço ou cliente, é recomendável que você modifique a descrição antes de chamar Open.
Definindo pontos finais em configuração
Ao criar um aplicativo, muitas vezes você deseja adiar decisões para o administrador que está implantando o aplicativo. Por exemplo, muitas vezes não há como saber com antecedência qual será um endereço de serviço (um URI). Em vez de codificar um endereço, é preferível permitir que um administrador o faça depois de criar um serviço. Esta flexibilidade é conseguida através da configuração. Para obter detalhes, consulte Configurando serviços.
Observação
Use a ServiceModel Metadata Utility Tool (Svcutil.exe) com a opção de nome do /config:ficheiro[,] para criar rapidamente ficheiros de configuração.
Usando pontos de extremidade padrão
Se nenhum ponto de extremidade for especificado no código ou na configuração, o tempo de execução fornecerá pontos de extremidade padrão adicionando um ponto de extremidade padrão para cada endereço base para cada contrato de serviço implementado pelo serviço. O endereço base pode ser especificado no código ou na configuração, e as endpoints padrão são adicionadas quando Open() é invocado em ServiceHost. Este exemplo é o mesmo exemplo da seção anterior, mas como nenhum ponto de extremidade é especificado, os pontos de extremidade padrão são adicionados.
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()
Se os pontos de extremidade forem fornecidos explicitamente, os pontos de extremidade padrão ainda poderão ser adicionados chamando AddDefaultEndpoints em ServiceHost antes de chamar Open. Para obter mais informações sobre pontos de extremidade padrão, consulte Configuração simplificada e configuração simplificada para serviços WCF.