Desenvolvimento - ASP. NET

.NET Remoting – Parte 2 - Acessando informações remotamente

Na primeira parte desse artigo, conhecemos com detalhes a arquitetura da tecnologia .NET Remoting. A parte final desse artigo abordará os detalhes do desenvolvimento para implantação de Remoting em suas aplicações.

por Andrey Sanches



Na primeira parte desse artigo (.NET Remoting – Parte 1), conhecemos com detalhes a arquitetura da tecnologia .NET Remoting. A parte final desse artigo abordará os detalhes do desenvolvimento para implantação de Remoting em suas aplicações. Faremos um exemplo simples de acesso e retorno dos dados para preenchimento de uma DataGrid afim de demonstrar de forma clara a implantação.

Teremos 4 projetos em nossa solution sendo eles:

  • Componente de Negócio (ClassLibrary): Classes de negócio do projeto que contendo as classes e métodos de negócio.
  • Componente de Interface (ClassLibrary): Interfaces com os métodos que serão implementados pelas classes de negócio.
  • Projeto de Interface com o usuário (WindowsApplication): Formulário com exibição de retorno dos dados
  • Aplicativo Servidor (Console Application): Componente para abertura do canal Remoting

Abra o Visual Studio .NET e vamos iniciar a criação da nossa aplicação que fará uso de .NET Remoting: Crie um novo projeto (Menu File => New => Project) escolha um projeto do tipo C# Class Library, nomeie o projeto para InterfaceRemoting, a Solution para Remoting e clique OK. Após a criação do Projeto, codifique o arquivo Class1.cs conforme mostra o código abaixo:

using System;

using System.Data;

namespace InterfaceRemoting

{

public interface ICliente

{

DataTable getCustomers();

}

}

Essa interface expõe o método getProducts que será implementado pelo componente de negócio e invocado pelo projeto WindowsApplication que criaremos logo a seguir. Em seguida adicione um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Class Library por nome Negocio, confirme com “OK” e codifique o arquivo Class1.cs conforme mostra o código abaixo:

using System;

using System.Data;

using System.Data.SqlClient;

using InterfaceRemoting;

namespace Negocio

{

public class Cliente: MarshalByRefObject, InterfaceRemoting.ICliente

{

public Cliente()

{

}

public DataTable getCustomers()

{

SqlConnection conn = new SqlConnection("Server=(local);Initial Catalog=NorthWind;Integrated Security=SSPI");

DataTable clientes = new DataTable(“Clientes”);

SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM Customers",conn);

adap.Fill(clientes);

return clientes;

}

}

}

Veja que estamos fazendo referência ao projeto InterfaceRemoting que contém a interface ICliente, vamos então referenciar o assembly no projeto. Para adicionar a referência, clique com o botão direito no Projeto Negocio => “Add Reference” => Guia “Projects” selecione o assembry e confirme conforme mostra a Figura 1. É necessário ainda tornar a classe Cliente derivada (herdar) de MarshalByRefObjecte também implementar a interface ICliente conforme visto anteriormente para que a infra-estrutura do Remoting seja capaz de interpretar a transferência dos objetos.


Figura 1 – Referenciando o Componente de Interface no Projeto

Continuando com o desenvolvimento da aplicação, vamos incluir o componente que ficará alocado no servidor. Para o exemplo, utilizaremos um projeto Console, deixo como dica utilizar um WinService para a criação do canal Remoting. Adicione então um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Console Application por nome Server, confirme com “OK” e codifique o arquivo Class1.cs conforme mostra o código abaixo:

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using Negocio;

namespace Server

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

RemotingConfiguration.RegisterWellKnownServiceType(typeof(Client e),"Negocio",WellKnownObjectMode.SingleCall);

ChannelServices.RegisterChannel(new TcpServerChannel(1235));

Console.WriteLine("Canal Remoting criado, aguardando requisições");

Console.ReadLine();

}

}

}

O objeto RemotingConfiguration utiliza do método RegisterWellKnownServiceType para informar os parâmetros de criação da infra-estrutura do Remoting. O parâmetro Type recebe o tipo do objeto que será tranportado pelo canal remoting. O segundo parâmetro recebe o nome da Ativação e o terceiro parâmetro recebe o tipo da Ativação (SingleCall / Singleton). Em seguida utilizamos do método RegisterChannel do objeto ChannelServices para registrar o canal do Remoting através da porta 1235 (poderia ser usado outra porta). Como você pode notar, fizemos referência aos namespaces do Remoting “System.Runtime”, para isso precisamos também referenciar o Assembly no projeto (botão direito no Projeto Server, aponte para “Add Reference”) conforme mostra a Figura 2:


Figura 2 - Referenciando o assembly System.Runtime.Remoting

Além dessa referência, ainda é necessário referenciar os assemblys Negocio e InterfaceRemoting (pois fazemos referencia a classe Cliente) utilizando o mesmo procedimento mas localizando-os na Guia Projects.

Por fim, criaremos a aplicação que fará a requisição do objeto Cliente remotamente e execução do método getCustomers().

Adicione então um novo projeto (clique com o botão direito na solution => “Add” => “New Project”) do tipo C# Windows Application por nome Client, confirme com “OK”. O Visual Studio criará o formulário padrão Form1.cs, formate o layout do formulário conforme mostra a figura abaixo:

Formulário

Text: Fazendo chamada ao componente remoto utilizando .NET Remoting

Botão

Text: Carregar Dados remotamente

Name: btCarregar

DataGrid

Name: dtgClientes


Layout do Formulário para carga dos dados remotamente

Adicione também a referência para o projeto InterfaceRemoting conforme mostra a Figura 1 e para o Assembly “System.Runtime.Remoting” conforme mostra a Figura 2.

Com o formulário já finalizado, importe os namespaces necessários e codifiquei o evento Click do botão btCarregar como mostra o código abaixo:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using InterfaceRemoting;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels.Tcp;

private void btCarregar_Click(object sender, System.EventArgs e)

{

ICliente cli;

cli = (ICliente)Activator.GetObject(typeof(ICliente),"tcp://localhost:1235/Negocio");

dtgClientes.DataSource = cli.getCustomers();

}

Ao clicar no botão btCarregar será feito a chamada ao componente remoto através do método getObject do objeto Activator. Ele recebe por parâmetro o tipo requerido para a chamada, o endereço remoto (no exemplo utilizei localhost) acompanhado da porta mais o nome da URI informada no componente Servidor. Veja que utilizamos o protocólo TCP mas como já visto no artigo anterior poderiamos ter utilizado HTTP para o tranporte do objeto. Após a chamada atribuimos o retorno ao dataGrid para que os dados sejam exibidos.

Para fazer o teste da aplicação, é necessário alterar a ordem da chamada dos projetos e configurar para executar em “Multiple Startup Projects”, para isso, clique com o botão direito na solution “Remoting” e configure a janela conforme mostra a figura abaixo.


Alterando a ordem de execução dos projetos


Canal Remoting aberto e aplicação Client com o retorno dos dados remotos

Conclusão

Nesse artigo vimos como é simples a implementação de acesso remoto utilizando .NET Remoting como alternativa a outros métodos. Com uma boa infra-estrutura e técnicas corretamente aplicadas, podemos obter grandes ganhos de performance nas chamadas aos componentes.


Andrey Sanches

Andrey Sanches - Consultor da ITGROUP, MVP (Most Valuable Professional), MCP (Microsoft Certifield Professional) e trabalha com desenvolvimento de sistemas na tecnologia .NET desde sua versão beta. Líder da comunidade de desenvolvedores Codificando.Net de SP (www.codificando.net), ministra treinamentos especializados na Treinando.Net (http://www.treinando.net) e em diversas empresas, também escreve constantemente artigos para sites como Portal Linha de código, DevMedia e revistas como MSDN Magazine e Web Mobile.