Desenvolvimento - Visual Basic .NET

Migração de .NET Remoting para WCF

Mostrarei alguns pontos importantes que devem ser observados para uma migração de .NET Remoting para Windows Communication Foundation (WCF), bem como a analise da necessidade de migração.

por Leonardo Bruno Bentes Lima



No ano de 2003, fui convidado para integrar a equipe que iria desenvolver a nova versão de um software que estava feito em Access. Por incrível que pareça, esse software era um ERP e atendia perfeitamente muitas micro e pequenas empresas. Para resumir, com o aumento da demanda, nesse nicho de mercado, por softwares mais robustos e para atender as novas necessidades dos nossos clientes, tivemos que projetar algo que pudesse atender necessidades como: ser escalável, poder ser acessado remotamente, gerenciar múltiplas empresas, ser de fácil atualização, ser seguro, ter bom desempenho, etc. Para isso, decidimos optar pela plataforma .NET para esse projeto.

Uma das maiores decisões foi a forma de comunicação entre as camadas da aplicação. Tinha que decidir entre o .NET Remoting e Web Service, e resolvi usar a primeira opção como padrão e Web Service como forma auxiliar em algumas situações. Não vou entrar no mérito da escolha, mas o fato é que com a breve chegada do .NET 3.0 e conseqüentemente do WCF, devo me preocupar com a "inevitável" migração.

Queria deixar claro que a migração não é compulsória, já que uma aplicação .NET Remoting pode funcionar em paralelo com uma WCF dentro do mesmo Application Domain.

Uma aplicação .NET Remoting, possui basicamente um Client, um assembly compartilhado entre o Server e o Client e um host que oferece o serviço. Caso você já use uma implementação baseada em interfaces, o que é aconselhável, a coisa fica bem mais simples. Basta adicionar os atributos do Namespace System.ServiceModel (<ServiceContract> e <OperationContract>). E se o tipo de ativação for Server Side (Singleton ou SingleCall), essa é única coisa que precisa ser feita em termos de codificação no server. No arquivo de configuração, temos que fazer uma alteração, como mostro abaixo:

<configuration>
  <system.runtime.remoting>
     <!-Pode deixar como está -->
  </system.runtime.remoting>
</configuration>

  <system.servicemodel>
     <services>
        <service name="MeuServer.MeuServico">
           <endpoint address="net.tcp://meusite.com/MeuServico" 
           binding="netTcpBinding" contract="IMeuServico" />
        </service>
     </services>
  </system.servicemodel>
</configuration>

O próximo passo é criar o host como mostro abaixo:

Dim oMeuHost as new ServiceHost(Gettype(MeuServico))
oMeuHost.Open()

E fazer umas pequenas alterações no Client, como no arquivo de configuração:

  <system.servicemodel>
     <client>
           <endpoint name=" MeuServico"
           address="net.tcp://meusite.com/MeuServico" 
           binding="netTcpBinding" contract="IMeuServico" />
     </client>
  </system.servicemodel>
</configuration>

E no código da aplicação client, devemos trocar a forma de criação do objeto para ficar dessa forma:

Dim ChFact as new ChannelFactory(Of IMeuServico)(" MeuServico")
Dim oMS as IMeuServico = ChFact.CreateChannel()

Já podemos dizer que a aplicação já está pronta para usar o WCF. Agora vejamos mais algumas considerações.

Custom objects: Caso você transporte custom objects entre as camadas de sua aplicação, é necessário fazer uma pequena alteração. Você terá que colocar o atributo <DataContract> em todas as classes que irão ser transportadas, bem como o atributo <DataMember> nos métodos e propriedades que você deseja que sejam vistas pelo WCF.

Exceptions: Por padrão, as exceptions que retornadas pelo server, serão enviadas como CommunicationException, o que obviamente não é prático para você tratar. Para evitar isso, decore as interfaces com o atributo <ServiceBehavior(ReturnUnknownExceptionAsFaults=True)>, dessa forma, as exception serão retornadas como FaultException, e você poderá receber informações mais detalhadas das exceptions e tratá-las de acordo.

Conclusão

Como mostrei, é fácil (embora trabalhosa para aplicações grandes) fazer a migração de .NET Remoting para WCF. Mas você deve analisar se a migração vale a pena de verdade. Para isso pese algumas coisas, como:

- Sua aplicação necessita de interoperabilidade? Se sim, o WCF é com certeza a melhor solução;

- Sua aplicação necessita de um incremento na segurança? Se sim, o WCF é infinitamente mais robusto do que o .NET Remoting nesse quesito;

- Sua aplicação utiliza algum mecanismo para gerenciar transações em ambiente distribuído? Se sim, não tenha dúvida quanto a migração;

Enfim, depois de analisar todas as suas necessidades e estudar as funcionalidades e recursos do WCF e decidir migrar, saiba que não será difícil fazer isso, desde que a sua implementação do .NET Remoting esteja da forma que apresentei, caso você use ativação no cliente (Client Activation) e não utilize interfaces, seu trabalho será bem mais complexo, mas em muitos casos valerá a pena.

Até a próxima.

Leonardo Bruno Bentes Lima

Leonardo Bruno Bentes Lima - Microsoft Most Valuable Professional, consultor em tecnologia .NET. Possui ampla experiência no desenvolvimento e analise de sistemas, dos quais 6 anos na plataforma .Net. Palestrante em diversos eventos sobre tecnologia .NET no Brasil e exterior. Atualmente trabalha Ivia informática (www.ivia.com.br).