Visão geral da criação de pontos finais
Toda a comunicação com um serviço Windows Communication Foundation (WCF) ocorre através dos pontos de extremidade do serviço. Os pontos de extremidade fornecem aos clientes acesso à 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 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 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.
Vinculaçã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, Secure Sockets Layer [SSL] ou segurança de mensagem SOAP). Para obter mais informações, consulte Usando ligações 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. Observe que um cliente também pode ser obrigado a implementar um contrato definido pelo serviço, chamado contrato de retorno de chamada, para receber mensagens do serviço em um MEP 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.
Nota
Ao adicionar um ponto de extremidade de serviço que executa a representação, você deve usar um dos AddServiceEndpoint métodos ou o GetContract(Type, Type) método para carregar corretamente o contrato em um novo ServiceDescription objeto.
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
IEcho
tipo de serviço que aceite o nome de alguém e ecoe com a resposta "Olá <nome>!".Implementar um
Echo
serviço do tipo definido peloIEcho
contrato.Especifique um endereço de ponto de extremidade para
http://localhost:8000/Echo
o serviço.Configure o
Echo
serviç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()
Nota
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.
Nota
As propriedades de no aplicativo de ServiceDescription serviço não devem ser modificadas posteriormente ao OnOpening método em ServiceHostBase. Alguns membros, como a Credentials propriedade e os AddServiceEndpoint
métodos em ServiceHostBase e ServiceHost, lançam uma exceção se 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 de extremidade na 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.
Nota
Use a ServiceModel Metadata Utility Tool (Svcutil.exe) com a opção de nome de /config:
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 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 os pontos de extremidade padrão são adicionados quando Open() é chamado 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 o botão antes de chamar Open.ServiceHost Para obter mais informações sobre pontos de extremidade padrão, consulte Configuração simplificada e configuração simplificada para serviços WCF.