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 - [email protected] Nuno Datia – [email protected] Autores e contributos • Autores – Luís Falcão • Contributos – – – – – Paulo Pereira Pedro Félix Jorge Martins Carlos Guedes Nuno Datia © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 2 Arquitecturas de extensão do servidor HTTP • CGI • ISAPI – ASP – ASP.NET © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 3 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 4 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 5 Criação dinâmica de recursos (com CGI) 1 - Mensagem HTTP (GET, POST) Apresentação Web Form CGI 2 - Criação do Processo CGI parâmetros da mensagem HTTP passados por variáveis de ambiente (GET), ou pelo Standard Input (POST) 3- Recurso gerado (via Standard Output) Web Browser 4- Resposta HTTP © ISEL 2006/2007 DEEC - LEIC – Programação na Internet Web Server 6 Variáveis de ambiente Variável Descrição GATEWAY_INTERFACE versão CGI SERVER_NAME nome ou endereço IP do servidor SERVER_SOFTWARE nome ou versão do software do servidor SERVER_PROTOCOL protocolo e versão usados pelo servidor (HTTP 1.X) SERVER_PORT porto do servidor REQUEST_METHOD método usado no pedido (GET, POST) PATH_INFO informação sobre a PATH do CGI PATH_TRANSLATED raiz do servidor + PATH_INFO SCRIPT_NAME nome do script CGI DOCUMENT_ROOT raiz do servidor WWW QUERY_STRING query string enviada através do método GET REMOTE_HOST nome do cliente REMOTE_ADDR endereço IP do cliente AUTH_TYPE método de autenticação do cliente REMOTE_USER nome do utilizador remoto (cliente) REMOTE_IDENT identificação do cliente (RFC) CONTENT_TYPE cabeçalho HTTP MIME Content-Type CONTENT_LENGTH número de bytes a ler do stdin (POST) HTTP_FROM Cabeçalho HTTP MIME From (email do cliente) HTTP_ACCEPT Cabeçalho HTTP MIME Accept (tipos aceites pelo cliente) HTTP_USER_AGENT Cabeçalho HTTP MIME User-Agent (aplicação cliente) HTTP_REFERER Cabeçalho HTTP MIME Referer (URL anterior) © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 7 CGI via Forms (1) Acede a um Form Envia o Form Utilizador faz submit do Form Reencaminhame nto para CGI Output recebido © ISEL 2006/2007 DEEC - LEIC – Programação na Internet Envio para cliente Processa os dados envia para servidor (ou para cliente) 8 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 9 #! /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); PERL 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; } 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(); C++ C# // Escrever o conteúdo System.Console.WriteLine(content); } } © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 10 CGI de echo Resultado no browser Os Forms podem simular uma sessão com estado (Hidden fields) © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 11 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. Web Server • Não é um processo • Mas sim uma DLL © ISEL 2006/2007 DEEC - LEIC – Programação na Internet Extensão ISAPI (Dll) Uma possível configuração… 12 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 13 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) 1. Carrega a dll (caso não esteja carregada) e invoca a função GetExtensionVersion permitindo à dll o registo da sua versão 2. 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) 3. Entrega o atendimento do pedido à dll invocando a função HttpExtensionProc passando-lhe a estrutura de dados anterior © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 14 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" © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 15 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> © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 16 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> © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 17 Arquitectura do IIS 5.0 InetInfo.exe DLLHost.exe Isapi_1.dll Isapi_1.dll Isapi_2.dll Isapi_3.dll Named Pipe • Processo principal (InetInfo.exe) Socket – Internet Services • Protocolo HTTP; Autenticação; Resolução de URLs HTTP Requests & Responses – Kernel Objects • Processos secundários (DLLHost.exe) – © ISEL 2006/2007 DEEC - LEIC – Programação na Internet Hosting de aplicações Hosting de aplicações 18 Hosting de aplicações no IIS 5.0 Main Process InetInfo.exe App 1 ... App n • Pooled Process DLLHost.exe App 1 ... App n Isolated Process 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 19 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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet Panel Add Remove Programs Add/Remove Windows Components) 20 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 assembly System.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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 21 Hosting de ASP .NET no IIS 5.0 InetInfo.exe aspnet_wp.exe IHttpHandler Named Pipe Page Class aspnet_isapi.dll Socket • aspnet_wp.exe process) (ASP.NET worker – Processo hospedeiro do runtime ASP.NET • CLR + System.Web API HTTP Requests & Responses • aspnet_isapi.dll (Extensão ISAPI) Kernel Objects © ISEL 2006/2007 DEEC - LEIC – Programação na Internet – Encaminha o atendimento de pedidos para URLs terminados em .aspx (entre outros) para o runtime ASP .NET – Utiliza para o efeito Named Pipes 22 Uma aplicação ASP.Net é um conjunto de assemblies executados em determinado AppDomain do host aspnet_wp.exe © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 23 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/enus/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 © ISEL 2006/2007 DEEC - LEIC – Programação na Internet 24