domingo, 23 de março de 2008

Fundamentos ASP.Net

Poderíamos definir como uma aplicação ASP.NET um web site configurado para executar ASP.NET. Cada site tem os seus próprios recursos(Imagens, páginas, javascripts, aspx e outros) e inclusive seu próprio Application Domain para processamento das requisições do usuário. Podemos e é até uma das grandes vantagens da Web fazer hiperlinks entre recursos entre diferentes sites e até servidores, mas cada site, mesmo que num mesmo servidor, tem seu próprio Application Domain.

Extensões de arquivo

Na versão dos IIS 6.0 é possível ver que algumas extensões são registradas para o processamento pelo ASP.NET, no IIS 7.0 há algumas mudanças, no sentido do ASP.NET já ser integrado, com certeza há estas extensões, mas ainda não vi como vai ficar.

No IIS 6.0 é possível ver isto abrindo o IIS, se estiver instalado, através do Iniciar / Painel de Controle / Ferramentas Administrativas / Internet Information Services. Expanda para visualizar o Default Web Site, e clique com o botão direito e vá em propriedades, conforme Imagem 1.


Imagem 1 - Propriedades do Web Site

Vá na tab Home Directory e clique no botão configuração, será aberto uma janela onde é mostrado as extensões de arquivos registradas para o IIS, há extensões ASP.NET e outras, veja na Imagem 2.


Imagem 2 - Mapeamento de extensões no IIS

Existem diferentes tipos de arquivos e com diferentes finalidades para um ASP.NET web site. A extensão mais conhecida é a extensão ASPX, que contêm html, xhtml e aspx markup. Veja a tabela abaixo as extensões de arquivos, versão da .Net framework em que foram incorporadas e sua descrição:

Extensão

Versão Requerida

Descrição

asax

1.0

Usado para a lógica de aplicação Global.asax

ascx

1.0

UserControls: controles customizados do usuário que são utilizados como controles dentro de páginas.

ashx

1.0

Usado para crier um HttpHandler customizado

asmx

1.0

Usado para responder por web services

aspx

1.0

Respondem como páginas para o usuário, normalmente se tem html, xhtml e aspx markup nestes

axd

1.0

Usado para recursos web especiais, que permitem empacotar componentes, controles, javascript, imagens e demais conteúdos a critério do desenvolvedor. Também utilizado pelo trace. package

browser

2.0

Características de diferentes navegadores guardados em formato XML; Com este o ASP.NET sabe qual capacidade tem o navegador e pode customizar o retorno da requisição do usuário.

Substitui a antiga seção BrowserCaps do web.config do ASP.NET

config

1.0

Arquivo para configurar a aplicação web.config , seu conteúdo é armazenado em XML.

cs/vb

1.0

Arquivo de código, a extensão cs é para linguagem C# e vb para Visual Basic. Poderão ser arquivos que estão no diretório App_Code ou arquivos code behind de outro recurso ASP.NET

master

2.0

Usado para master pages

resx

1.0

Arquivos de recursos para internacionalização e localização.

sitemap

2.0

Usado para configuração do sitemap

skin

2.0

Usado como skin para Themes

svc

3.0

arquivo de service baseado no Windows Communication Foundation

Existe a extensão de projeto “csproj”, mas na versão 3.5 o padrão de web sites é não ter arquivos de projetos.

Estrutura de diretórios

Além dos diretórios que é possível criar para a organização da aplicação, como pastas para imagens, estilos e javascripts, existem diretórios especiais da aplicação, conforme tabela abaixo:

Diretório

Descrição

App_Browsers

Contem arquivos específicos de definição para navegadores

App_code

Contem arquivos de código. Estes arquivos são compilados em um assembly que é acessível no código de toda página

App_Data

Diretório padrão para arquivos de dados e base de dados como Access e Sql Express.

App_LocalResources

Diretório que contêm arquivos de recursos de localização para toda página do site’

App_GlobalResources

Armazena arquivos de recurso de localização disponível para toda página do site

App_Themes

Armazenam themas

App_WebReferences

Armazem arquivos wsdl que referênciam web services consumidos pela aplicação asp.net

Bin

Armazenam assemblies da aplicação e que a aplicação faz referência

Ciclo de vida da aplicação ASP.NET para IIS 7.0

O IIS 7.0 permite dois modos de executar de executar aplicações ASP.NET, integrado para framework .net 3.0 ou posteriores, ou modo clássico que se comporta da mesma maneira que aplicações ASP.NET rodando em IIS 5.0 e IIS 6.0.

Para responder a uma requisição de usuário, há várias etapas de processamento que devem ocorrer.

Modo clássico

O usuário requisita um recurso de um servidor web, tipicamente o IIS. O servidor web examina a extensão do recurso solicitado, determina qual extensão ISAPI manipula a requisição e repassa a requisição para para a extensão ISAPI apropriada.

Se for a primeira requisição, o Application Manager cria um Application Domain. Dentro do Application Domain uma instancia do HostingEnviroment é criado, este fornece informações sobre a aplicação. A imagem 3 mostra este cenário:


Imagem 3 – Relação IIS, Application Manager, Application Domain e HostingEnviroment

Para toda requisição são criados e inicializados objetos como HttpContext, HttpRequest e HttpResponse.

O próximo passo é criar uma instância da classe HttpApplication. Esta será compartilhada por todos usuários da aplicação. Se a aplicação for configurada para tal, o módulo SessionStateModulo é criado. A Imagem 4 ilustra estas instâncias:


Imagem 4 – Contexto de objetos da requisição

Eventos de Ciclo de vida e o Global.asax

Durante o ciclo de vida da aplicação, eventos são levantados que podemos programar através do arquivo Global.asax, que fica na raiz da aplicação. Estes eventos propiciam um controle da aplicação e da sessão. Importante ainda ressaltar o conceito aplicação, como seus eventos e variável HttpApplication é comum a todos os usuários do site e o conceito de sessão é único para cada usuário. A Imagem 5 mostra alguns dos eventos, os mais comumente utilizados:


Imagem 5 - Eventos do Global.asax

Application_Start – executado somente quando a aplicação é iniciada

Application_End – executado no encerramento da aplicação

Application_Error – executado quando houver erros não tratados pela aplicação

Session_Start – executado quando iniciar a sessão de usuário

Session_End – executado ao encerrar uma sessão, quando o sessionstate estiver configurado como InProc no weeb.config

Variáveis de sessão e aplicação

Podemos armazenar variáveis comuns a todos usuários que acessam nossa aplicação ASP.NET através da instância Application que é um objeto da classe HttpApplicationState. Como esta instância é compartilhada entre todos os usuários usuários o ASP.NET fornece uma maneira de garantir que somente você esteja fazendo alterações, através do método Lock() e do UnLock(). Como estes métodos fazem que outros usuários que desejam acessar a session fiquem travados, use-os com cuidado.

Podemos armazenar variáveis comum a determinado usuário com o uso de sessão, o servidor possibilita o uso de sessão através de configuração, e esta é ativa por padrão. Para usarmos a sessão podemos utilizar o objeto Session que é uma instância da classe HttpSessionState. A Imagem 6 mostra o uso dessas variáveis no Global.asax, o que também é possível em páginas e outras classes da aplicação Web.


Imagem 6 – Uso de Application e Session

Dica: use Application e Session com cuidado e ver quando estamos as utilizando por necessidade ou comodismo.

Se atente ainda ao fato que as sessões expiram com um tempo determinado, o padrão que pode ser alterado são 20 minutos. É importante também lembrar da arquitetura Web, Stateless

A Imagem 6 já dá uma idéia de como começar, mas já pensou em como montar um site onde mostraríamos o nome do usuário e informassemos a quantidade de usuários ativos? Depois de feito, poderíamos abrir vários navegadores e ao acessar o site, ver este contador aumentando, e utilizarmos do método Session.Abandon() para vermos este número diminuindo.

Referências:

http://msdn2.microsoft.com/en-us/library/bb470252.aspx

http://msdn2.microsoft.com/en-us/library/ms178473.aspx

http://wiki.asp.net/page.aspx/274/file-extension/

http://en.wikipedia.org/wiki/ASP.NET

http://wiki.asp.net/page.aspx/246/directory-structure-in-aspnet/

http://msdn2.microsoft.com/pt-br/magazine/cc135973.aspx

http://msdn2.microsoft.com/en-us/library/bb470252.aspx

http://msdn2.microsoft.com/en-us/library/bf9xhdz4(vs.71).aspx