Artigo .net Magazine 37 - Utilizando controles Windows diretamente em páginas Web

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

capa_NET37_G.gif

Clique aqui para ler todos os artigos desta edição

Utilizando controles Windows diretamente em páginas Web

 

Este artigo discute

Este artigo usa as seguintes tecnologias

·       O que são Windows Controls;

·       Criação de Windows Controls;

·       Usando Windows Controls em aplicações Web;

·       Usando Windows Controls em aplicações Windows Forms;

Visual Studio 2005, ASP.NET 2.0, Windows Forms, Windows Controls e C#.

 

Com a consolidação do ASP.NET no ambiente Web, os desenvolvedores têm hoje a sua disposição controles (Web e HTML Controls) que reduzem muito a complexidade na criação de interfaces ricas em funcionalidade. Controles como DataGrid, Login e Validators deixam claro o quanto a mais o conjunto de classes do .NET Framework oferece em relação aos modelos antigos de desenvolvimento Web (alguém se lembra da dobradinha CGI/Perl?).

  Mesmo com toda essa evolução, em algumas situações não existe um controle Web pronto ou então que possa ser desenvolvido no prazo e dentro do custo esperado que possa resolver determinado problema. Para essas ocasiões é possível recorrer aos Windows Controls, que são controles normalmente utilizados em aplicações Windows Forms, ricos em funcionalidade e que têm a sua disposição as classes voltadas para o desenvolvimento Windows (Windows Forms e a Windows API).

Neste artigo aprenderemos a criar um Windows Control customizado e utilizá-lo diretamente em uma aplicação Web.

 

Funcionamento

Antes de colocarmos a mão na massa é essencial compreender como funciona essa técnica. O assembly do Windows Control gerado será embutido em uma página ASPX através da tag <object>.

Ao renderizar a página, o Internet Explorer interpretará essa tag e fará automaticamente (respeitando as definições de segurança) o download do controle para a máquina do cliente.

Em seguida esse controle será executado diretamente da página ASPX, utilizando o .NET Framework da máquina do cliente e respeitando as definições de segurança locais. O funcionamento é semelhante ao modelo de desenvolvimento Web utilizando um ActiveX Control.

 

Criando o Windows Control WebTimer

O primeiro passo será criar um Windows Control para utilizá-lo em um projeto Web. Criaremos um controle simples, para não perder o foco no objetivo principal (que é aprender como utilizar um Windows Control em uma aplicação Web).

O WebTimer utilizará: Timer e Label, para oferecer a funcionalidade de um contador no ambiente Web. Esse controle terá uma propriedade (Interval) que controlará a freqüência do contador.

Para facilitar os testes, vamos criar uma solução vazia para então adicionarmos o projeto do WebTimer. No Visual Studio 2005, clique em File>New>Project. Escolha Blank Solution em Other Projects Types>Visual Studio Solutions. Vamos nomeá-la como “WindowsControlSolution” e clicar em OK.

No Solution Explorer, clique com o botão direito na solução e selecione Add>New Project. Selecione um projeto do tipo Windows Control Library (da linguagem C#), nomeie-o como “WinControlLib” e clique em OK (Figura 1).

  image002.jpg

Figura 1. Criando um projeto Windows Control Library

 

Com o projeto criado, apague o arquivo UserControl1.cs que é criado por padrão (clique com o botão direito e escolha Delete). Agora vamos adicionar um novo arquivo do tipo User Control.

Clique com o botão direito no WinControlLib, selecione Add>User Control. Altere seu nome para “WebTimer.cs” e clique em OK (Figura 2).

 

image004.jpg 

Figura 2. Adicionando um User Control a um projeto existente

 

Com o WebTimer.cs aberto em modo design, arraste um Timer e um Label. Nomeie o Timer para “tmeMain” e o Label como “lblCount”. Configure a propriedade Enabled do tmeMain como True e a Interval com o valor “1000”.

Agora vamos adicionar o código ao controle. Clique duas vezes no Timer e adicione o código a seguir, no evento Tick:

 

private void tmeMain_Tick(object sender,

  System.EventArgs e)

{

    lblCount.Text = Convert.ToString(++iCount);

}

 

Declare a variável iCount como um atributo da classe WebTimer conforme o seguinte código:

 

private Int32 iCount = 0;

 

Por fim, adicione a propriedade Interval, conforme a Listagem 1.

 

Listagem 1. Propriedade Interval

public Int32 Interval

{

   get

    {

        return tmeMain.Interval;

    }

    set

    {

        tmeMain.Interval = value;

    }

}

 

O evento Tick do Timer é executado toda vez que o intervalo definido é atingido. Em nosso caso criamos uma variável chamada iCount que será incrementada e exibida no lblCount toda vez que o intervalo do Timer for atingido.

Através da propriedade Interval poderemos definir esse intervalo. Selecione a opção Build>Build Solution e pronto, o WebTimer está criado. Vamos agora criar um aplicação Windows Forms para testá-lo.

 

Testando o WebTimer em uma aplicação Windows Forms

Adicione à solução WindowsControlSolution um novo projeto Windows Application. Para isso, no Solution Explorer, clique com o botão direito e selecione Add>New Project. Selecione um projeto do tipo Windows Application, nomeie-o como “WinApp” e clique em OK (Figura 3).

 

 image006.jpg

Figura 3. Criando um projeto Windows Application

 

No modo design, arraste para o formulário o WebTimer. Para achá-lo, clique na aba WinControlLib Components da Toolbox (Figura 4).

 

 image008.jpg

Figura 4. WebTimer na Toolbox do Visual Studio

 

Com o controle posicionado no formulário, faça o rebuild da solução (Build>Rebuild Solution) e em seguida execute a aplicação WinApp. Verifique se o projeto WinApp está configurado como projeto inicial (no Solution Explorer, clique com o botão direito no projeto e selecione Set as StartUp Project). Com a aplicação em execução, repare que a cada segundo o contador é incrementado e o seu valor é exibido (Figura 5). Agora que já testamos o controle, vamos adicioná-lo a um projeto Web.

image010.jpg 

Figura 5. Projeto WinApp em execução

 

Adicionando o WebTimer a uma página web

Já criamos o controle customizado (WebTimer) e testamos ele através de uma aplicação Windows. Agora vamos criar uma aplicação ASP.NET para testá-lo. No Solution Explorer, clique com o botão direito e selecione Add>New Web Site.

Selecione ASP.NET Web Site, configure a Language como Visual C# e dê o nome de “WebApp”. Neste exemplo, usaremos o IIS como servidor Web (o Visual Studio 2005 possui um servidor “embutido”, para quem não possui o IIS instalado). Clique em OK (Figura 6).

 image012.jpg

Figura 6. Criando um projeto ASP.NET Web Application

 

Configure o projeto WebApp como inicial, clicando no mesmo com o botão direito no Solution Explorer e selecionando a opção Set as StartUp Project. O Solution Explorer deverá ficar igual ao da Figura 7.

 

image014.jpg

Figura 7. Solution Explorer final com os projetos

 

Abra o arquivo WebForm1.aspx e alterne para o modo HTML. Em seguida insira o código da Listagem 2 (a partir da tag <object>).

 

Listagem 2. Código HTML do arquivo WebForm1.aspx

...

</div>

<OBJECT id="MyWinControl1"    

  classid="WinControlLib.dll#WinControlLib.WebTimer"

  VIEWASTEXT>

<PARAM NAME="Interval" VALUE="1000">

</OBJECT>

...

 

Repare na tag <object>, pois é através dela que adicionamos o controle a uma página ASPX. O atributo mais importante é o classid, pois é através dele que referenciamos o WebTimer. O valor desse atributo é formado por duas partes (separadas pelo caractere #). A primeira parte define o nome do assembly onde se encontra o controle a ser inserido (em nosso caso, WinControlLib.dll).

A segunda define a classe que herda de User Control, incluindo o nome do namespace. Podemos também passar parâmetros para o controle, através da tag <param>. É possível definir várias tags <param> dentro de uma <object>.

Na Listagem 2 estamos passando o valor 1000 como parâmetro para o Interval. Lembre-se que definimos anteriormente a propriedade Interval no arquivo WebTimer.cs no projeto do controle.

Antes de executar o projeto Web, para visualizar a página com o controle em execução, será necessário realizar um último passo: copiar o assembly do controle para a pasta do projeto Web. Faça o rebuild da solução (Build>Rebuild Solution) e então copie o arquivo WinControlLib.dll para a pasta onde se encontra a WebApp.

Para toda alteração no controle, você precisará recompilá-lo e copiá-lo novamente para a pasta do projeto web. Após a cópia, execute a aplicação WebApp. Como discutimos na introdução, o Internet Explorer fará o download do arquivo WinControlLib.dll e então iniciará a execução local.

Repare que o contador será incrementado sem qualquer interação com o servidor (sem postbacks). A Figura 8 exibe a página com o WebTimer em execução. Se você acessar a pasta de arquivos temporários do seu computador, verá que o WinControlLib.dll é, de fato, copiado antes de ser executado.

 

image016.jpg

Figura 8. Projeto web em execução utilizando o controle WebTimer

 

Resolução de problemas

Você seguiu todos os passos anteriores e, ao executar o projeto, tudo o que você vê é uma página em branco? Isso pode acontecer por causa de um dos fatores a seguir:

1 - Atributo classid

Um dos erros mais comuns é o valor incorreto no atributo classid da tag <object>. Lembre-se que a segunda parte do atributo (depois do #) deve incluir o nome completo da classe, juntamente com o namespace (que ao seguir os passos do artigo é WinControlLib.dll#WinControlLib.WebTimer).

2 - Definições de segurança

As definições de segurança da máquina do cliente podem evitar que o controle seja executado. Acesse o item Microsoft .NET Framework 2.0 Configuration dentro de Ferramentas Administrativas do Painel de Controle. Na página inicial acesse Configure Code Access Security Policy e em seguida entre em Adjust Zone Security.

Selecione a zona a ser editada (no caso da execução local, Local Intranet) e verifique o nível de permissão (trust), conforme a Figura 9. Aumente o nível de permissão, aplique as configurações e verifique se o problema foi resolvido.

 

image018.jpg

Figura 9. Ajuste do nível de segurança para a zona Local Intranet

 

3 - Permissão de execução no IIS

Existe uma configuração para a permissão de execução de uma pasta virtual/web site no IIS que pode impedir que uma página Web que hospede um Windows Control funcione corretamente.

Abra o IIS e clique com o botão direito em WebApp e selecione Propriedades. Na aba Diretório virtual, na opção Permissões de execução, certifique-se de que a opção Somente scripts está selecionada (Figura 10).

 

image020.jpg

Figura 10. Configuração da permissão de execução da pasta virtual WebApp

 

Limitações

Existem duas limitações nessa abordagem que podem impedir a sua utilização ampla. A primeira é que para executar um Windows Control embutido em uma página Web no cliente, é necessário que ele esteja utilizando no mínimo o Internet Explorer 5.01.

Essa restrição não é um problema para uma intranet, porém em um ambiente mais amplo como a Internet trata-se de uma séria limitação. Nesse caso, é bem provável que você possa tirar proveito dessa técnica com maior freqüência em projetos internos de uma empresa.

A segunda limitação é quanto a comunicação entre um controle hospedado em uma página ASPX e a própria página. Se temos um determinado valor em um TextBox na instância atual de um Windows Control hospedado em uma página, nada mais trivial do que clicar em um botão (Web Control) presente nessa mesma página e recuperar o valor do TextBox, certo?

Infelizmente não é tão trivial e será necessário recorrer a alguns recursos como a utilização de arquivos para a troca de informações entre a página e o Windows Control hospedado por ela.

 

Restrições de segurança

O ambiente Web não é seguro. Essa é a premissa que a plataforma .NET utiliza para executar os Windows Controls embutidos em páginas Web. Na verdade, o ambiente de execução do .NET (CLR) checará as configurações de segurança aplicadas no ambiente local do cliente antes de executar qualquer ação.

Para a simples ação de executar o download do controle, será necessário que tal permissão seja associada a determinado grupo. Da mesma maneira, acesso a banco de dados e manipulação do sistema de arquivos também são passíveis de restrição.

As restrições de segurança são aplicadas e gerenciadas através do CAS (Code Access Security). O assunto é bem amplo e, portanto não terei como abordá-lo neste artigo. Mas lembre-se sempre de verificar se as permissões que o seu controle necessita estarão disponíveis no ambiente de execução do cliente.

 

Conclusão

A utilização de Windows Controls em aplicações Web permite maior flexibilidade na construção de interfaces ricas. Você também pode utilizar essa técnica na migração gradativa de aplicações Windows Forms para aplicações Web, transformando um formulário em um User Control e em seguida utilizando-o na Web. As possibilidades são muitas, principalmente para aplicações em um ambiente de Intranet.

 

.NET Magazine PLUS!

Acesse agora o mesmo o Portal do Assinante .NET Magazine (www.devmedia.com.br/dotnet) e assista a uma vídeo aula de André Cardona, que mostra como trabalhar com Windows Control.

www.devmedia.com.br/articles/viewcomp.asp?comp=1586

 

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?