Compartilhar via


Usando um cliente WCF para acessar um serviço

Depois de criar um serviço, a próxima etapa será criar um proxy de cliente WCF. O aplicativo cliente usa o proxy do cliente WCF para se comunicar com o serviço. Os aplicativos cliente geralmente importam os 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:

  1. Compile o código do serviço.

  2. Gere o proxy do cliente WCF.

  3. Instancie o proxy do cliente WCF.

O proxy do cliente WCF pode ser gerado manualmente usando a Ferramenta do Utilitário de Metadados do Modelo de Serviço (SvcUtil.exe). Para obter mais informações, confira a Ferramenta do Utilitário de Metadados do ServiceModel (Svcutil.exe). O proxy do cliente WCF também pode ser gerado no Visual Studio usando o recurso Adicionar Referência de Serviço. Para gerar o proxy do cliente WCF usando qualquer método, 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 Utilitário de Metadados ServiceModel

A Ferramenta do Utilitário de Metadados do ServiceModel (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 (Linguagem de Descrição dos Serviços Web) e XSD (linguagem de definição de esquema XML) 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 será o nome do arquivo de saída. Se dois nomes de arquivo forem dados, o primeiro arquivo será 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 a configuração, confira Configurando Associações para Serviços.

Importante

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 você está se comunicando é quem diz que é, as informações que você recupera 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 para o 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 as 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 de metadados ServiceModel e a opção Adicionar Referência de Serviço no Visual Studio geram a seguinte classe de cliente WCF. A classe herda da classe genérica ClientBase<TChannel> e implementa a interface ICalculator. A ferramenta também gera a interface ICalculator (não mostrada 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 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)

Exceções de depuração geradas por um cliente

Muitas exceções geradas 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 anulada. Isso pode ser causado por um erro no processamento da mensagem, porque o tempo limite foi excedido pelo host remoto ou por um problema de recursos 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, confira Rastreamento e Uso do rastreamento para solucionar problemas de seu aplicativo.

Confira também