Visão geral de criação de ponto de extremidade
Toda a comunicação com um serviço Windows Communication Foundation (WCF) ocorre por meio dos pontos de extremidade do serviço. Os pontos de extremidade fornecem à funcionalidade que um serviço WCF oferece. 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 de extremidade
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 endereço EndpointAddress, que contém um Uniform Resource Identifier (URI) e propriedades de endereço que incluem uma identidade, alguns elementos da linguagem WSDL e uma coleção de cabeçalhos opcionais. Os cabeçalhos opcionais fornecem informações de endereçamento detalhadas adicionais para identificar ou interagir com o ponto de extremidade. Para obter mais informações, consulte Especificando um endereço de ponto de extremidade.
Associação. A associação especifica como se comunicar 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, protocolo SSL ou segurança de mensagem SOAP). Para obter mais informações, consulte Como usar associações para configurar serviços e clientes.
Contrato de serviço. 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 mensagem de processamento ou 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 Criando contratos de serviço. Observe que um cliente também pode ser necessário para implementar um contrato definido pelo serviço, chamado de contrato de retorno de chamada, para receber mensagens do serviço em um MEP duplex. Para obter mais informações, consulte Serviços de duplex.
O ponto de extremidade de um serviço pode ser especificado de forma imperativa usando código ou declarativamente por meio da configuração. Se nenhum ponto de extremidade for especificado, o runtime fornecerá pontos de extremidade padrão adicionando um ponto de extremidade padrão para cada endereço básico para cada contrato de serviço implementado pelo serviço. Definir pontos de extremidade no código geralmente não é prático, porque as associações e os endereços para um serviço implantado normalmente são diferentes daqueles usados conforme 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 endereçamento e associação fora do código permite que elas sejam alteradas sem a necessidade de compilar ou implantar novamente o aplicativo.
Observação
Ao adicionar um ponto de extremidade de serviço que executa a representação, você deve usar um dos AddServiceEndpoint métodos ou o método GetContract(Type, Type) para carregar corretamente o contrato em um novo objeto ServiceDescription.
Definindo pontos de extremidade 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 tipo de serviço
IEcho
que aceite o nome de alguém e ecoe com a resposta "Olá <nome>!".Implemente um serviço
Echo
do tipo definido pelo contratoIEcho
.Especifique um endereço de ponto de extremidade de
http://localhost:8000/Echo
para o serviço.Configure o serviço
Echo
usando uma associação 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()
Observação
O host de serviço é criado com um endereço básico e, em seguida, o restante do endereço, em relação ao endereço básico, é 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 do aplicativo de serviço não devem ser modificadas posteriormente para o método OnOpening em ServiceHostBase. Alguns membros, como a propriedade Credentials e os métodos AddServiceEndpoint
em ServiceHostBase e ServiceHost, lançam uma exceção se modificados além desse ponto. Outros permitem modificá-los, mas o resultado é indefinido.
Da mesma forma, no cliente, os valores ServiceEndpoint não devem ser modificados após a chamada para OnOpening no ChannelFactory. A propriedade Credentials gera 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 modificar a descrição antes de chamar Open.
Definindo pontos de extremidade na configuração
Ao criar um aplicativo, você geralmente deseja adiar as 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 faça isso depois de criar um serviço. Essa flexibilidade é realizada por meio da configuração. Para obter detalhes, consulte Configurando Serviços.
Observação
Use a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) com o comutador /config:
nome de arquivo[,
nome de arquivo]
para criar rapidamente arquivos de configuração.
Usando pontos de extremidade padrão
Se nenhum ponto de extremidade for especificado no código ou na configuração, o runtime fornecerá pontos de extremidade padrão adicionando um ponto de extremidade padrão para cada endereço básico para cada contrato de serviço implementado pelo serviço. O endereço básico pode ser especificado no código ou na configuração, e os pontos de extremidade padrão são adicionados quando Open() são chamados no 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 no 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.