Jump to content


Photo

Asp .net No Mono


  • Faça o login para participar
1 reply to this topic

#1 MACUL

MACUL

    Doutor

  • Usuários
  • 770 posts
  • Sexo:Masculino
  • Localidade:SP

Posted 23/08/2004, 14:14

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:
<%@ 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


Votação (Média):

Notiquem-me quando existirem novos comentários

Comentários: Flat Nested Threaded Embedded Mais Antigo Mais Recente

Bom ... ou melhor .. excelente artigo ...
Por Esqueleto em terça-feira, 6 de julho de 2004 (PST)
Viva

Antes demais devo dizer que estou extraordináriamente chatiado com este BLOG, por não usar mecanimos standard para inserção de Conteúdos.

Com o Mozilla não conseguia inserir nada, tive que esperar por hoje para, no trabalho, usar o Windows para aqui escreve qualquer coisa..... desculpem, mas isso vai contra todas as regras de acessibilidades.

Adiante. Pedro, fiquei muito contente com o teu artigo, eu já te tinha pergunta como se fazia isto mesmo, e se havia algum guião para nos ensinar a fazer... e fiquei muito contente por alguém que saida o tenha feito.

Mesmo assim ainda fiquei com algumas duvidas:

como coloco o XSP a aceitar pedidos para vários Sites na mesma porta!??!?
Será que posso ter um serviço comercial baseado no XSP?
Poderei fazer debug neste tipo de aplicações? Como?
Quando crio um ASPX no MonoDevelop deixo de poder ter código em HTML, isto é, pretendo ter uma pagina com um Place Holder que o coloco dentro de uma tabela em HTML e dentro do Code Behind, no evento de click de um botão, adicionar algo a esse Place Holder. É possivel fazer ? Como ?
Sei que são muitas dúvidas. Talvez seja respondidas na parte II desde documento, essa sim já uma parte para desenvolvimento avançado.

Bom trabalho .... e obrigado



(())

Esqueleto
*************** M ** A ** C ** U ** L ***************

*************************************************

#2 rbfigueira

rbfigueira

    Novato no fórum

  • Usuários
  • 2 posts
  • Sexo:Não informado

Posted 03/09/2004, 10:05

Pelo menos deverias ter citado a fonte de informação !!!

O autor é o Pedro Santos :
http://www.pontonetp...rtigos/368.aspx

Uma abraço,
Ricardo Figueira
http://rbfigueira.net


[:: Site da Comunidade ::]
http://www.PontoNetPT.com

[:: Forum WEB ::]
http://www.PontoNetP...um/default.aspx

[:: .NET Weblogs ::]
http://weblogs.pontonetpt.com/

Edição feita por: rbfigueira, 03/09/2004, 10:08.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq