270 likes | 424 Views
Arquitecturas de extensão do servidor HTTP CGI | ISAPI : ASP, ASP.NET. Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.pt Nuno Datia – datia@isel.ipl.pt. Autores e contributos. Autores Luís Falcão Contributos Paulo Pereira Pedro Félix
E N D
Arquitecturas de extensão doservidor HTTPCGI | ISAPI : ASP, ASP.NET Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptNuno Datia – datia@isel.ipl.pt
Autores e contributos • Autores • Luís Falcão • Contributos • Paulo Pereira • Pedro Félix • Jorge Martins • Carlos Guedes • Nuno Datia
Arquitecturas de extensão do servidor HTTP • CGI • ISAPI • ASP • ASP.NET
Tecnologias de servidor • A interface CGI (Common Gateway Interface) • Interface standard de extensão do servidor Web • Suportada pela maioria dos servidores Web • Define a interface que as aplicações devem cumprir por forma a estenderem o comportamento do servidor Web • Associação de comportamento a URLs (Geração dinâmica de páginas) • Podem ser desenvolvidas em qualquer linguagem que ofereça suporte para acesso a variáveis de ambiente, ao standard input e ao standard output • Alternativas à interface CGI • Soluções Microsoft: A interface ISAPI: ASP, ASP.NET • Soluções Sun: Servlets; JSP; JSF • Outras: PHP
CGI – O que é? • Mecanismo que permite ao servidor WEB comunicar com aplicações que processam pedidos HTTP • Como? • Por cada pedido é criado (com base no URL) um processo responsável pelo seu atendimento • Qual o input do processo? • stdin redireccionado para a ligação com o cliente • Variáveis de ambiente com informação relativa ao pedido, ao servidor e ao cliente • Qual o output do processo? • stdout redireccionado para a ligação com o cliente
1 - Mensagem HTTP (GET, POST) Web Form Web Browser Web Server Criação dinâmica de recursos (com CGI) Apresentação 2 - Criação do Processo CGIparâmetros da mensagem HTTP passados por variáveis de ambiente (GET), ou pelo Standard Input (POST) CGI 3- Recurso gerado (via Standard Output) 4- Resposta HTTP
CGI via Forms (1) Servidor HTTP Aplicação CGI Browser Acede a um Form Envia o Form Utilizador faz submit do Form Processa os dados envia para servidor (ou para cliente) Reencaminhamento para CGI Envio para cliente Output recebido
CGI via Forms (2) Um Form simples <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Livro de Convidados </title> </head> <body> <h1>Preencha o meu livro de convidados!</h1> <form method="GET" action="/cgi-bin/convidados.exe"> <pre> Primeiro Nome: <input type="text" name="FirstName" /> Ultimo Nome: <input type="text" name="LastName" /> Password: <input type="password" name="Password" /> <input type="submit" /> <input type="reset" /> </pre> </form> </body> </html> URL gerado: http://www.contoso.com/cgi-bin/convidados.exe?FirstName=Eusébio&LastName=Ferreira&Password=qwerty
PERL #! /usr/local/bin/perl print “HTTP/1.1 200 OK\n"; print "Content-type: text/html", "\n\n"; print "<html>", "\n"; print "<head><title>CGI livro de convidados escrito em Perl></title></head>", "\n"; print "<body><h1> Bem vindo ao meu livro de convidados </h1>, "\n"; print "REQUEST_METHOD", "$ENV{´REQUEST_METHOD´’}", "\n"; print "QUERY_STRING", "$ENV{´QUERY_STRING´’}", "\n"; print "</body></html>", "\n"; exit(0); C++ void main() { char *env; cout<<“HTTP/1.1 200 OK"<<endl; cout<<"Content-type: text/html"<<endl<<endl; cout<<"<html>"<<endl; cout<<"<head><title>CGI livro de convidados escrito em C++</title></head>“<<endl; cout<<"<body><h1> Bem vindo ao meu livro de convidados </h1>" <<endl; env = getenv("REQUEST_METHOD"); cout <<"REQUEST_METHOD: " << (env != NULL ? env : "") << "<br />" << endl; env = getenv("QUERY_STRING"); cout <<"QUERY_STRING: " << (env != NULL ? env : "") << "<br />" << endl; cout << "</body></html>" << endl; } C# class V1 { public static void ProcessRequest() { string content = @"<html> <head><title>title>CGI livro de convidados escrito em C++</title></head><body>Olá, sou um CGI gerado pela versão 2.</body></html>"; // Escrever os headers System.Console.WriteLine("HTTP/1.1 200 OK"); System.Console.WriteLine("Content-Type: text/html"); System.Console.WriteLine(string.Format("Content-Length: {0}", content.Length)); System.Console.WriteLine(); // Escrever o conteúdo System.Console.WriteLine(content); } }
CGI de echo Resultado no browser Os Forms podem simular uma sessão com estado (Hidden fields)
ISAPI • As extensões ISAPI são uma tecnologia do lado do servidor que, juntamente com o CGI, foram das primeiras tecnologias a permitir gerar conteúdos dinâmicos como resposta a pedidos • Esta tecnologia visa resolver um dos problemas existentes no CGI – Um processo por pedido, que não é reutilizado • Com ISAPI é diferente: uma vez carregada, esta fica em memória. • Não é um processo • Mas sim uma DLL Uma possível configuração…
Internet Information Services - IIS • A arquitectura natural de expansão do IIS baseia-se na interface ISAPI (Internet Services API) • Carregamento dinâmico de código recorrendo a dlls • A interface ISAPI é composta por: • Funções definidas e exportadas pela dll e invocadas pelo IIS • Estruturas de dados para troca de informação entre IIS e dll • Callbacks fornecidos pelo IIS para invocação na dll • Prevê duas formas de extensão do comportamento do IIS • ISAPI Extensions - Permitem definir novos endpoints para atendimento de pedidos • ISAPI Filters - Permitem interceptar e alterar o conteúdo das streams de comunicação com o cliente
ISAPI Extensions • Definem novos endpoints para tratamento de pedidos (no contexto do IIS) • Através de associações entre extensão do URL e ISAPI que é responsável pelo tratamento do pedido (ver associações no IIS) • Passos do IIS no atendimento do pedido (se existir associação) • Carrega a dll (caso não esteja carregada) e invoca a função GetExtensionVersionpermitindo à dll o registo da sua versão • Preenche uma instância de EXTENSION_CONTROL_BLOCK com a informação relativa ao pedido e as funções de callback a utilizar pela dll (por exemplo: WriteClient e ReadClient) • Entrega o atendimento do pedido à dll invocando a funçãoHttpExtensionProcpassando-lhe a estrutura de dados anterior
Active Server Pages - ASP • Tecnologia Microsoft para o desenvolvimento da camada de UI de aplicações Web (identificada pelas extensões *.asp e *.asa) • Uma ASP é composta pelo template de apresentação (definido em HTML) e script a ser interpretado no servidor • Os seguintes objectos são fornecidos implicitamente pelo ambiente de execução da página (objectos intrínsecos) • Request – contém informação relativa ao pedido • Response – permite manipular a resposta • Session – armazenamento de estado associado ao utilizador • Application – para partilha de estado entre todos os utilizadores da aplicação • Server – permite obter informação relativa ao servidor Web • É suportada na extensão ISAPI implementada em "asp.dll"
Demo 1 • Sample ASP Page (SampleASP.asp) <%@ language="javascript" %> <script language="Jscript" runat="server" > function Add(x, y) { return x+y; } </script> <html> <body> <h1>Test ASP Page </h1> <h2>2+2=<%=Add(2,2)%></h2> <table border=2> <% for (var i=0; i<10; i++) { %> <tr><td>Row<%=i%> Col0</td><td>Row<%=i%> Col1</td></tr> <% } %> </table> <% Response.Write("<h2>Written directly to Response</h2>"); %> </body> </html>
Demo 2 • Contador com ASP <%@ Language=JavaScript %> <html> <head> <script language="JavaScript" runat="server" > function inc() { if (Request.QueryString.Item("incr").Count ==0) return 0; return Number(Request.QueryString.Item("incr")) + 1; } </script> </head> <body> <form id="Form1" method="get" name="Form1" > <input type="text" id="incr" name="incr" value="<%=inc() %>" /> <input type="submit" value="Increment" ID="Submit1" /> </form> </body> </html>
Arquitectura do IIS 5.0 • Processo principal (InetInfo.exe) • Internet Services • Protocolo HTTP; Autenticação; Resolução de URLs • Hosting de aplicações • Processos secundários (DLLHost.exe) • Hosting de aplicações InetInfo.exe DLLHost.exe Isapi_1.dll Isapi_1.dll Isapi_2.dll Isapi_3.dll Named Pipe Socket HTTP Requests & Responses Kernel Objects
App 1 App 1 ... ... App n App n Hosting de aplicações no IIS 5.0 Main Process Pooled Process Isolated Process InetInfo.exe DLLHost.exe DLLHost.exe Isolated Application • Modos de isolamento de aplicações Web • Low (Main Process): Executada no processo principal do IIS • Medium (Pooled Process): Executada num processo secundário partilhado • Todas as aplicações com este nível de isolamento são hospedadas neste processo • High (Isolated Process): Executada num processo secundário dedicado
Configuração no IIS 5.0 (ISAPI: ASP) • O servidor HTTP IIS apenas está disponível na versão profissional do Windows XP • Por omissão, não está instalado. (Control Panel Add Remove Programs Add/Remove Windows Components)
ASP .NET – O que é? • Notoriedade deve-se à sua utilização no desenvolvimento da camada de UI de aplicações Web • No contexto do desenvolvimento de aplicações Web suportadas pela plataforma .NET • É fundamentalmente o conjunto de tipos .NET que participam no atendimento de pedidos HTTP • Tipos do espaço de nomes System.Web e dos espaços de nomes nele contidos • Estes tipos estão definidos no assemblySystem.Web.dll • Caracteriza-se por uma arquitectura extensível • Designada HTTP Pipeline • As páginas ASP.NET são “apenas” um dos pontos terminais no atendimento de pedidos
Hosting de ASP .NET no IIS 5.0 InetInfo.exe aspnet_wp.exe Named Pipe aspnet_isapi.dll PageClass IHttpHandler • aspnet_wp.exe(ASP.NET worker process) • Processo hospedeiro do runtime ASP.NET • CLR + System.Web API • aspnet_isapi.dll(Extensão ISAPI) • Encaminha o atendimento de pedidos para URLs terminados em .aspx (entre outros) para o runtime ASP .NET • Utiliza para o efeito Named Pipes Socket HTTP Requests & Responses Kernel Objects
Uma aplicação ASP.Net é um conjunto de assemblies executados em determinado AppDomain do hostaspnet_wp.exe
Referências • CGI • W3C (http://www.w3.org/CGI/) • NCSA (http://hoohoo.ncsa.uiuc.edu/cgi/) • ISAPI • MSDN Library http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_isapi_server_extensions_and_filters.asp Fritz Onion, “Essential ASP.NET with Examples in C#”, Addison-Wesley, 2003 Fritz Onion, “Essential ASP.Net 2.0”, Addison-Wesley, 2006