Requesitos
Este artigo vai-se focar no XSP, que é um servidor web stand alone para aplicações web em .NET. Significa isto que o XSP corre sozinho, sem mais nada. Também há uma variante do XSP para ligar ao Apache: mod_mono. Contudo os conceitos são praticamente os mesmos para as duas opções. Para usar o XSP é necessário ter o Mono instalado. Mais sobre isso em: Instalar o Mono no Linux.
Este artigo tem em conta que quem o lê está familiarizado com as ASP .NET em geral.
Introdução
Vamos começar por tentar perceber o que acontece quando é feito um pedido para o XSP. Quando fazemos um pedido para uma aspx, o servidor tem de processar a informação que está nesse ficheiro, tem de o transformar numa classe. Essa classe é guardada num assembly temporário, e só será compilada no primeiro pedido. Todos os pedidos seguintes, desde que o aspx nao seja alterado, vão usar o mesmo código.
Normalmente, temos sempre um ficheiro de código (code behind), associado a um ficheiro de apresentação (aspx, ascx). Se nós temos o nosso aspx a derivar de uma classe que está num outro ficheiro, como é que o servidor sabe onde ele está? Não sabe! A única coisa que o servidor sabe, é que há uma directoria bin, na raiz da aplicação web, que tem assemblies que a aplicação precisa. Neste caso ele ia carregar esses assemblies e encontrar a class da qual derivava a nossa classe de apresentação.
Aplicação de Teste I
Para ilustrar, vamos a um simples exemplo. vamos criar uma directoria para a nossa aplicação, e vamos fazer umas páginas de teste. Vamos começar com uma página simples, sem nada de especial, só para ver se o XSP está a funcionar... Também criamos a directoria bin, onde mais tarde vamos por o nosso código compilado.
$ mkdir asp-net
$ cd asp-net/
$ mkdir bin
Agora, vamos criar uma página de exemplo, de nome teste1.aspx, com o conteúdo:
<html>
<head>
<title>Teste às ASP .NET no Mono</title>
</head>
<body>
Olá Mundo!
</body>
</html>
Para criar este ficheiro, podem usar o vosso editor favorito, se é que o têm. Um editor mais user friendly pode ser o gedit.
Agora vamos experimentar. Para isso temos de por o servidor a correr. Para o fazer, a forma mais fácil e prática, é chamá-lo directamente da directoria onde estão, ou seja, na directoria onde está o teste1.aspx:
$ xsp
Adding applications '/:.'...
Registering application:
Host: any
Port: any
Virtual path: /
Physical path: /home/pre/tmp/asp-net
Listening on port: 8080
Listening on address: 0.0.0.0
Root directory: /home/pre/tmp/asp-net
Hit Return to stop the server.
Se tudo correu bem, devem ter um output análogo ao anterior. Obtemos logo várias informações, como o sitio onde está a correr a nossa aplicação, o porto onde o servidor está a escutar (8080), etc. Também podemos ter o XSP a atender pedidos para várias aplicações web ao mesmo tempo, mas deixo isso para os mais curiosos. Para ver a nossa página, agora temos de chamar o browser e ir ao endereço: http://localhost:8080/teste1.aspx. Se tudo correu bem, vemos uma página com a frase "Olá Mundo!" lá escrita.
Aplicação de Teste II
Agora vamos juntar o code behind à mistura. Para isso precisamos de fazer umas pequenas alterações ao nosso ficheiro ascx. Vamos colocar uma Label, cujo texto será afectado na class de code behind, no evento OnLoad. Aqui está o teste2.aspx:
~/tmp/asp-net/teste2.html.html
<%@ Page Language="c#" Inherits="Mono.Teste2" %>
<html>
<head>
<title>Teste II às ASP .NET no Mono</title>
</head>
<body>
<asp:Label id="msg" runat="server" />
</body>
</html>
Para completar, precisamos do ficheiro de código que tem a classe Mono.Teste2, da qual a nossa classe de apresentação vai herdar. O ficheiro é o seguinte, e pode ser colocado na mesma directoria do ficheiro teste2.aspx:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Mono {
public class Teste2 : Page {
protected Label msg;
protected override void OnLoad( EventArgs args )
{
base.OnLoad(args);
msg.Text = "Olá Mundo!";
}
};
}
Temos é de compilar o ficheiro para um assembly, e colocá-lo na directoria bin da nossa aplicação web. Para isso usamos o mcs, o compilador de C# do Mono, com o seguinte comando:
$ mcs teste2.cs -r:System.Web -t:library -out:bin/teste1.dll
Compilation succeeded
Correu tudo bem e ele compilou bem. Não esquecer da referência para o assemby System.Web, de gerar uma class library, e de colocar o ficheiro de output na directoria bin. Nota que o nome é irrelevante, e que os ficheiros de código podem estar em qualquer lado, desde que o assembly gerado se encontre no bin.
Indo de novo ao browser, mas desta ver ao endereço http://localhost:8080/teste2.aspx devemos ver a nossa página. Vai ser mostrada a mesma coisa, mas aqui já tamos a usar code behind!
Como disse nos requesitos, o objectivo não era ensinar ASP .NET. Era alguém que já sabe ASP .NET poder ler isto e conseguir fazer algo facilmente em Mono/Linux. Por outro lado é bom saber como funcionam os servidores Web, para não pensarmos que o VS .NET faz tudo por magia... aqui não há magia nenhuma.
Aplicação de Teste III - Usando o MonoDevelop
Naturalmente já conseguimos fazer aplicações, mas dá sempre jeito usar uma IDE mais poderosa, com intellisense, que nos torne mais produtivos. Neste momento (aquando da realease do Mono 1.0), o MonoDevelop 0.5 ainda não tem suporte directo para as ASP .NET, está a ser trabalhado. Contudo, pelo que já disse até agora, pode-se bem usar um projecto do tipo class library para termos o nosso código, podendo assim usar uma IDE para fazer a nossa aplicação web.
Vamos começar por abrir o MonoDevelop e criar um projecto novo, na mesma directoria onde estavamos a trabalhar. Ir a File -> New Project/Solution e preencher a seguinte janela, escolhendo o tipo C# Library (DLL), e a directoria onde o projecto vai ficar:
São criados de borla dois ficheiros, o AssemblyInfo.cs e o MyClass.cs. Acho irritante esta mania das IDEs de estar a criar coisas que eu não pedi... mas pronto. :-)
Vamos aproveitar o MyClass para fazer o nosso code behind, e vamos adicionar o aspx ao projecto: Click com o botão direito do rato em cima do ícone da solution, e Add New Files. Como ainda não temos lá na lista um ficheiro aspx, incluam um qualquer e depois mudem-lhe o nome para teste3.aspx. Depois copiem o conteúdo do ficheiro teste2.aspx lá para dentro mudando a class base para Mono.Teste3.
Agora temos de dar um jeito no main. Apaguem o que lá está e copiem o conteúdo do ficheiro teste2.cs lá para dentro, mudando somente o nome da classe para Teste3.
Agora tem de se adicionar a referência para o System.Web. Click com o botão direito do rato em cima de References e seleccionar o assembly System-Web no GAC:
Ao procurar este assembly, podem encontrar outros relacionados com o NUnit, ByteFX, etc. Vários projectos open source que já vem por defeito no Mono.
Agora podemos compilar o projecto. Podemos usar o F5, ou então o ícone lá em cima para compilar. Agora também é passear um pouco pela aplicação para conhecer os cantos à casa! Mas ainda falta uma coisa! O MonoDevelop está a gerar o assembly na directoria bin/Debug. É como o VS .NET faz com projectos normais. O que temos de fazer é dizer ao MonoDevelop para colocar o assembly simplesmente na directoria bin, para que o XSP o encontre.
Para isso vamos às propriedades do projecto (botão direito -> properties) -> Configurations -> Debug -> Output:
Compilem novamente para que o assembly seja criado no sítio correcto. Agora basta por o XSP a correr na nossa directoria, e ir ao browser ver a página http://localhost:8080/teste3.aspx. Se tudo correu bem, vêm mais um Olá mundo! :-)
Conclusão
Não tenham medo de estar sempre a reiniciar o XSP, que ele não se importa! Espero que este artigo sirva para dar um pontapé de arranque a quem está a começar com ASP .NET no Mono. Alguma dúvida coloquem em comentário que tentarei responder.
Pedro Santos :: blog