sexta-feira, 13 de junho de 2008

.NET Remoting no IIS com BinaryFormatter

O .NET Remoting é o mecanismo do .NET Framework que permite o desenvolvimento de aplicações distribuídas.

Na Mobiltec estamos desenvolvendo um sistema distribuído, onde passei pela necessidade de montar a Arquitetura da solução utilizando o Remoting. Neste sistema, os objetos estarão hospedados no IIS, onde a comunicação é efetuada através de HTTPChannel, e será utilizada serialização binária com BinaryFormatter.

A configuração do ambiente do Remoting é cercada de detalhes. A seguir reproduzo um passo a passo desta configuração, com trechos de código e configurações. Os códigos, escritos em C#, não são parte do sistema citado, apenas exemplos.

Definição dos objetos distribuídos

Os objetos distribuídos representam serviços que uma camada de componentes oferece para uma camada de apresentação do sistema. Para viabilizar a criação de Proxies, por parte do .NET Remoting, é necessário que a classe que representa o objeto distribuído faça herança do tipo MarshalByRefObject. Interfaces são aplicadas para que a camada 'consumidora' dos objetos remotos conheça os métodos oferecidos pelo objeto remoto. Segue um exemplo.

public class AccountBLL: MarshalByRefObject, IAccountBLL
{
 Account IAccountBLL.GetAccount(string _accountName)
 {
 ...
 }
}

Definição dos objetos 'transportados'

As classes que representam os objetos a serem transportados são serializadas/desserializadas para a comunicação. O atributo Serializable é utilizado para indicar que uma classe pode ser serializada.

[Serializable]
public class Account
{
 public string Name
 {
 get { ... }
 set { ... }
 }

 public <ListTransaction> Transactions
 {
 get { ... }
 set { ... }
 }
}

Configuração do servidor IIS

A pasta virtual do IIS contém os binários da parte servidora do sistema em uma pasta bin e o respectivo Web.config da aplicação. No Web.config, configuramos as propriedades do .NET Remoting e os objetos que são expostos na rede. O exemplo a seguir utiliza a combinação do canal HTTP com o BinaryFormatter e exporta um objeto exemplo.

<configuration>
 <system.runtime.remoting>
 <application>

 <!-- Canal HTTP com formatação binária -->
 <channels>
 <channel ref='http'>
 <serverProviders>
 <formatter ref='binary'/>
 </serverProviders>
 </channel>
 </channels>

 <!-- Serviços expostos -->
 <service>
  <wellknown mode="SingleCall"
   type="BLL.AccountBLL, BLL"
   objectUri="Account.rem"/>
 </service>

 </application>
 </system.runtime.remoting>
</configuration>

Configuração da aplicação cliente

A aplicação cliente, assim como o servidor, deve indicar o uso do HTTPChannel e BinaryFormatter.

<configuration>
 <system.runtime.remoting>
 <application>

 <!-- Canal HTTP com formatação binária -->
 <channels>
 <channel ref='http'>
 <clientProviders>
 <formatter ref='binary'/>
 </clientProviders>
 </channel>
 </channels>

 </application>
 </system.runtime.remoting>
</configuration>

No início da aplicação, ou em algum outro momento conveniente, deve ser aplicada esta configuração explicitamente (Perceba que no servidor não foi necessário. O próprio ASP.NET se encarregou de aplicar as configurações do Web.config)

RemotingConfiguration.Configure("App.config", false);

Acesso aos objetos remotos

Já estamos prontos para fazer o acesso ao objeto remoto na aplicação cliente. A interface do componente remoto é utilizada para fins de montagem do Proxy do objeto e para acesso aos métodos disponíveis.

IAccountBLL accBLL = (IAccountBLL)
 Activator.GetObject(typeof(IAccountBLL),
 "http://localhost/SampleRemoting/Account.rem");

Account acc = accBLL.GetAccount("Nome");

O .NET Remoting viabilizou o acesso a um objeto remoto, como se fosse uma instância local. Então muito cuidado. É necessário cercar o acesso com tratamentos relacionados à disponibilidade do serviço remoto e também é preciso considerar os impactos de performance.

0 Comments: