WCF - Windows Comunication Foundation - Introdução


Vou iniciar o artigo com a definição do WCF do Site do WCF - onde lemos que:

Windows Communication Foundation (WCF) is...

a part of the .NET Framework that provides a unified programming model
for rapidly building service-oriented applications that communicate across
the web and the enterprise.
Read the WCF whitepaper.

Get it

Beginner's Guide

Learn more

Traduzindo...: O WCF é uma parte da .NET Framework que fornece um modelo unificado de programação para construir de forma rápida aplicações distribuidas orientadas a serviço (SOA).

A tecnologia WCF - Windows Communication Foundation, surgiu com a .NET Framework 3.0 com o objetivo de unificar as até então existentes tecnologias de programação distribuidas como: COM+ , MSMQ-Message Queue, Enterprise Services, .NET Remoting e Web Services.

Com o advento da WCF foi criada uma plataforma com uma API que facilitou de forma considerável o desenvolvimento de aplicações distribuídas visto que o WCF não esta acoplado as regras de negócio que deverão ser expostas pelo serviço.

Para iniciar com o WCF existem alguns conceitos básicos que você deve conhecer para projetar, implementar e hospedar os seus serviços. Na verdade os templates WCF fornecidos no Visual Studio simplificam muito este processo visto que eles fornecem um serviço modelo que pode ser imediatamente hospedado e testado com as ferramentas de teste WCF. Assim chamar um serviço WCF a partir de um cliente é também uma tarefa simples , basta gerar um proxy e escrever o código contra o seu modelo de objetos.

Componentes de um serviço WCF

O que é um serviço WCF ?

Podemos também dar a definição formal da Microsoft que diz:  "All communication with a Windows Communication Foundation (WCF) service occurs through the endpoints of the service. Endpoints provide clients access to the functionality offered by a WCF service."

Ou seja...: "Toda comunicação com um serviço WCF ocorre através de endpoints do serviço. Os endpoints fornecem aos clientes o acesso às funcionalidades oferecidas por um serviço WCF."

O que venha a ser então é esse tal de endpoint ?

Cada serviço precisa ter um endereço (Adress) que define onde o mesmo reside. certo ?
Cada serviço deve possuir também um contrato (Contract) que define o que o serviço vai fazer. Certo ?
Cada serviço também deve possuir uma vinculação (Binding) que define como se comunicar com o serviço. Certo ?

Então no WCF o relacionamento entre o endereço (Address), o contrato (Contract) e a vinculação (Binding)  é chamada de EndPoint.

Ou seja :   Address + Binding + Contract = Endpoint   (o famoso ABC's endpoints)

Vamos começar definindo então quais os componentes fazem parte de um serviço WCF:

A primeira etapa para criar um serviço WCF e efetuar a definição do contrato pois é o contrato que vai definir quais operações serão expostas pelo serviço, que informações são necessárias para que essas operações sejam executadas e qual o tipo de retorno esperado.

Obs: O contrato é uma interface que contém as assinaturas dos métodos que serão expostos. A interface deverá ser decorada com o atributo:ServiceContract

WCF - Tipos de contratos

A seguir temos um resumo dos tipos de contratos existentes onde os código exemplo mostrados foram obtidos do template padrão para WCF Service obtido no Visual Web Developer 2008 Express.

Existem 3 tipos de contratos WCF :

Contratos de serviços (Service Contracts) - Descrevem as operações que um serviço pode realizar. (Mapeia os tipos CLR para WSDL). Será detalhado mais abaixo. Exemplo:

<ServiceContract()> _
Public Interface IService
    <OperationContract()> _
    Function GetData(ByVal value As Integer) As String
    <OperationContract()> _
    Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType
    ' TODO: Add your service operations here
End Interface

Contratos de Dados (Data Contracts) - Descreve a estrutura de dados usada no serviço. (Mapeia tipos CLR para XSD).  Um Data Contract é um acordo formal entre um serviço e um cliente que descreve os dados que serão trocados entre ambos. Para estabelecer a comunicação, o cliente e o serviço não necessitam trocar necessariamente os mesmos tipos de dados, devem trocar apenas os mesmos data contracts.

Um Data Contract especifica para cada parâmetro ou tipo de retorno qual informação será serializada (convertida em XML) para ser trocada.  Os DataContracts são definidos através de classes e uma classe DataContract deverá ser decorada com o atributo DataContract e os campos e propriedades que o tipo possui devem ser decorados com o atributo DataMember. (A partir do service pack  versão 3.5 da plataforma .NET isso não é mais obrigatório)

' Use a data contract as illustrated in the sample below to add composite types to service operations.
<DataContract()> _
Public Class CompositeType
    Private boolValueField As Boolean
    Private stringValueField As String
    <DataMember()> _
    Public Property BoolValue() As Boolean
        Get
            Return Me.boolValueField
        End Get
        Set(ByVal value As Boolean)
            Me.boolValueField = value
        End Set
    End Property
End Class

Contratos de Mensagens (Message Contracts) - Define a estrutura de mensagens usadas no serviço. (Mapeia os tipos CLR para mensagens SOAP)

Os contratos de mensagens permitem ao serviço interagir diretamente com mensagens e podem ser tipados ou não tipados. Eles são úteis em casos de interoperabilidade e quanto existe um formato de mensagem com o qual devemos dar conformidade e/ou customizar.

Por meio dos contratos de mensagens podemos ter um controle maior sobre a estrutura de mensagem SOAP usada pelo WCF efetuando uma personalização dos componentes da mensagem.

Os Contratos de Mensagens são definidos em classes e as mesmas devem ser decoradas com o atributo MessageContract. Além disso uma classe definida com um contrato de Mensagem deve possuir um construtor sem parâmetros.

Nas classes para especificar se um campo fará parte do header ou do body da mensagem devemos usar os atributos MessageHeader ou MessageBodyMember.

Exemplo:

[MessageContract]
public class BankingTransaction
{
  [MessageHeader] public Operation operation;
  [MessageHeader] public DateTime transactionDate;
  [MessageBodyMember] private Account sourceAccount;
  [MessageBodyMember] public int amount;
}

Projetando um contrato para um serviço WCF

Vamos falar agora um pouco mais sobre os Contratos de serviços (Service Contracts).

Para implementar um serviço WCF iniciamos pela definição do contrato para o serviço e então implementamos o contrato em um tipo de serviço. Um contrato para um serviço geralmente envolve a aplicação do atributo ServiceContract para uma interface e então a aplicação do atributo OperationContract para cada método exposto como parte do contrato do serviço.  A seguir veja as regras para a definição de um contrato:

Na figura abaixo temos um exemplo de um template padrão fornecido pelo Visual Studio onde vemos um contrato definido na interface com duas operações:

Criando um serviço WCF na prática

Vou mostrar um exemplo bem simples onde irei criar um serviço WCF para validar um email usando o Visual Studio 2008 e em seguida irei consumir o serviço em um projeto Windows Forms.

Abra o Visual Studio 2008 e crie um novo projeto do tipo (File-> New Project) do tipo Web usando o template WCF Service Application com o nome Wcf_Exemplo;

A seguir vamos definir no arquivo de interface  IService.vb o contrato do nosso serviço definindo a operação ValidarEmail() que irá validar um email e retornar True ou False conforme o resultado. Para isso remova o código existente e defina o seguinte código no arquivo de interface IService1.vb:

Agora no arquivo Service.svc implemente a interface IService1 definida acima e o método ValidarEmail conforme abaixo:

Execute um Build no projeto e verifique se não há erros.(Se desejar você pode publicar o serviço em: http://localhost/Wcf_Exemplo)

Pronto, já temos nosso serviço criado e preparado para ser consumido. Vamos fazer isso em uma aplicação Windows Forms.

Consumindo o serviço WCF

A partir do menu File selecione Add -> New Project e selecione o template Windows Forms Application com o nome windows_WCF;

Vamos incluir uma referência ao serviço WCF criado. Para isso clique com o botão direito sobre o nome do projeto Windows Forms e selecione Add  Service Reference;

A seguir clique no botão Discover para procurar por serviços na Solution. Deverá ser encontrado o nosso serviço WCF criado conforme a figura abaixo. Vamos aceitar o nome padrão da referência e clicar no botão OK;

No formulário form1.vb da aplicação Windows Forms inclua a partir da ToolBox um controle Label, um controle TextBox (txtEmail) e um botão de comando (btnValidarEmail) conforme o leiaute abaixo:

No evento Click do botão de comando inclua o seguinte código:

Private Sub btnValidarEmail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValidarEmail.Click


' criando uma instƒncia do nosso servi‡o WCF

Dim WCF_ValidaEmail As New ServiceReference1.Service1Client


'usando o m‚todo ValidarEmail do nosso servi‡o

If WCF_ValidaEmail.ValidarEmail(txtEmail.Text) Then

     MsgBox(" Email V lido.")

Else

     MsgBox(" Email Inv lido.")

End If

End Sub

Defina o projeto Windows Forms como o projeto que será executado clicando sobre o nome do projeto e selecionando a opção - Set as Startup Project.

Ao executar projeto efetuando testes com alguns emails iremos obter :

Email válido E-mail inválido (existe uma vírgula após yahoo)

Embora seja muito simples e eu não tenha me preocupado com validações nem com as melhores práticas mostrei como criar um serviço WCF e consumi-lo usando o VS 2008. Podemos fazer isso de outras formas e em breve voltarei ao assunto.

Aguarde...

Pegue o projeto completo aqui:   windows_WCF.zip   e Wcf_Exemplo.zip

Eu sei é apenas WCF mas eu gosto...

Referências:


José Carlos Macoratti