Acessando serviços usando um cliente WCF
Depois de criar um serviço, a próxima etapa é criar um proxy de cliente WCF. Um aplicativo cliente usa o proxy de cliente WCF para se comunicar com o serviço. Os aplicativos cliente geralmente importam metadados de um serviço para gerar o código do cliente WCF que pode ser usado para invocar o serviço.
As etapas básicas para criar um cliente WCF incluem o seguinte:
Compile o código de serviço.
Gere o proxy do cliente WCF.
Instancie o proxy do cliente WCF.
O proxy do cliente WCF pode ser gerado manualmente usando a ferramenta Service Model Metadata Utility Tool (SvcUtil.exe) para obter mais informações, consulte ServiceModel Metadata Utility Tool (Svcutil.exe). O proxy de cliente WCF também pode ser gerado dentro do Visual Studio usando o recurso Adicionar referência de serviço. Para gerar o proxy do cliente WCF usando qualquer um dos métodos, o serviço deve estar em execução. Se o serviço for auto-hospedado, você deverá executar o host. Se o serviço estiver hospedado no IIS/WAS, você não precisará fazer mais nada.
Ferramenta de utilitário de metadados ServiceModel
A ServiceModel Metadata Utility Tool (Svcutil.exe) é uma ferramenta de linha de comando para gerar código a partir de metadados. O uso a seguir é um exemplo de um comando Svcutil.exe básico.
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Como alternativa, você pode usar Svcutil.exe com arquivos WSDL (Web Services Description Language) e XSD (XML Schema Definition Language) no sistema de arquivos.
Svcutil.exe <list of WSDL and XSD files on file system>
O resultado é um arquivo de código que contém o código do cliente WCF que o aplicativo cliente pode usar para invocar o serviço.
Você também pode usar a ferramenta para gerar arquivos de configuração.
Svcutil.exe <file1 [,file2]>
Se apenas um nome de arquivo for fornecido, esse é o nome do arquivo de saída. Se dois nomes de arquivo forem fornecidos, o primeiro arquivo é um arquivo de configuração de entrada cujo conteúdo é mesclado com a configuração gerada e gravado no segundo arquivo. Para obter mais informações sobre configuração, consulte Configurando ligações para serviços.
Importante
As solicitações de metadados não seguras representam certos riscos da mesma forma que qualquer solicitação de rede não segura: se você não tiver certeza de que o ponto de extremidade com o qual está se comunicando é quem diz ser, as informações recuperadas podem ser metadados de um serviço mal-intencionado.
Adicionar referência de serviço no Visual Studio
Com o serviço em execução, clique com o botão direito do mouse no projeto que conterá o proxy do cliente WCF e selecione Adicionar>referência de serviço. Na caixa de diálogo Adicionar Referência de Serviço, digite a URL do serviço que você deseja chamar e clique no botão Ir. A caixa de diálogo exibirá uma lista de serviços disponíveis no endereço especificado. Clique duas vezes no serviço para ver os contratos e operações disponíveis, especifique um namespace para o código gerado e clique no botão OK .
Exemplo
O exemplo de código a seguir mostra um contrato de serviço criado para um serviço.
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
// Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
' Other methods are not shown here.
End Interface
A ferramenta utilitário ServiceModel Metadata e Add Service Reference no Visual Studio gera a seguinte classe de cliente WCF. A classe herda da classe genérica ClientBase<TChannel> e implementa a ICalculator
interface. A ferramenta também gera a interface (não mostrada ICalculator
aqui).
public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
public CalculatorClient()
{}
public CalculatorClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{}
public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{}
public CalculatorClient(string endpointConfigurationName,
System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{}
public CalculatorClient(System.ServiceModel.Channels.Binding binding,
System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{}
public double Add(double n1, double n2)
{
return base.Channel.Add(n1, n2);
}
}
Partial Public Class CalculatorClient
Inherits System.ServiceModel.ClientBase(Of ICalculator)
Implements ICalculator
Public Sub New()
MyBase.New
End Sub
Public Sub New(ByVal endpointConfigurationName As String)
MyBase.New(endpointConfigurationName)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal endpointConfigurationName As String,
ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(binding, remoteAddress)
End Sub
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
Implements ICalculator.Add
Return MyBase.Channel.Add(n1, n2)
End Function
End Class
Usando o cliente WCF
Para usar o cliente WCF, crie uma instância do cliente WCF e, em seguida, chame seus métodos, conforme mostrado no código a seguir.
// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")
' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)
Depurando exceções lançadas por um cliente
Muitas exceções lançadas por um cliente WCF são causadas por uma exceção no serviço. Alguns exemplos disso são:
SocketException: Uma conexão existente foi fechada à força pelo host remoto.
CommunicationException: A conexão subjacente foi fechada inesperadamente.
CommunicationObjectAbortedException: A conexão de soquete foi abortada. Isso pode ser causado por um erro ao processar sua mensagem, um tempo limite de recebimento sendo excedido pelo host remoto ou um problema de recurso de rede subjacente.
Quando esses tipos de exceções ocorrem, a melhor maneira de resolver o problema é ativar o rastreamento no lado do serviço e determinar qual exceção ocorreu lá. Para obter mais informações sobre rastreamento, consulte Rastreamento e uso do rastreamento para solucionar problemas do seu aplicativo.
Consulte também
- Como: Criar um cliente
- Como: Acessar serviços com um contrato duplex
- Como chamar operações de serviço de forma assíncrona
- Como acessar serviços com contratos unidirecionais e de solicitação-resposta
- Como: Acessar um serviço WSE 3.0
- Noções básicas sobre o código do cliente gerado
- Como: Melhorar o tempo de inicialização de aplicativos cliente WCF usando o XmlSerializer
- Especificando o comportamento de tempo de execução do cliente
- Configurando comportamentos de cliente