Arquitecturas de extensão do servidor HTTP CGI e ISAPI: ASP, ASP.NET Programação na Internet Secção de Sistemas e Tecnologias de Informação ISEL-DEETC-LEIC Luis Falcão - [email protected] Carlos Guedes – [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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 2 Arquitecturas de extensão do servidor HTTP • CGI – Interface standard de extensão do servidor HTTP • ISAPI – Solução oferecida pela Microsoft (na aplicação IIS) – Tecnologias suportadas • ASP • ASP.NET 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 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? • Standar Input (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? • Standard Output (stdout) redireccionado para a ligação com o cliente 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 5 Criação dinâmica de recursos (com CGI) 1. Pedido HTTP (GET, POST) 2. Criação do Processo CGI Apresentação Web Form CGI parâmetros da mensagem HTTP passados por variáveis de ambiente (GET), ou pelo Standard Input (POST) 2 3 3. 1 Recurso gerado (via Standard Output) 4 Web Browser 4. Web Server Resposta HTTP 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 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) 2007 - 2009 Arquitecturas de extensão do servidor HTTP ©ISEL/DEETC/STI – Programação na Internet 7 Demo 1 CGI de ECHO • Executar o CGI que faz echo do pedido HTTP e das variáveis de ambiente – Usar o servidor TIWebServer 8 CGI via Forms (1) Acede a um Form Envia o Form Utilizador faz submit do Form Reencaminhame nto para CGI Output recebido 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Envio para cliente Processa os dados envia para servidor (ou para cliente) Arquitecturas de extensão do servidor HTTP 9 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 10 #! /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); } } 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 11 CGI de echo Resultado no browser Os Forms podem simular uma sessão com estado usando (Hidden fields) 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 12 ISAPI 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet 13 ISAPI • As extensões ISAPI são uma tecnologia do lado do servidor que, juntamente com o CGI, foram das primeiras tecnologias a suportar a geração de 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 Web Server Extensão ISAPI (Dll) Uma possível configuração… 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 14 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 15 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 16 ISAPI: ASP 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet 17 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" 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 18 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> 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 19 Demo 2: Contador com ASP <%@ language="javascript" %> <html> <head> <script language="Jscript" 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> 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 20 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 – Hosting de aplicações Kernel Objects • Processos secundários (DLLHost.exe) – Hosting de aplicações 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 21 Hosting de aplicações no IIS 5.0 Main Process InetInfo.exe Pooled Process DLLHost.exe App 1 ... App n • Isolated Process DLLHost.exe App 1 ... App n 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 22 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) 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 23 ISAPI: ASP.NET 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet 24 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 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 25 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 (ASP.NET worker process) – Processo hospedeiro do runtime ASP.NET • CLR + System.Web API HTTP Requests & Responses Kernel Objects 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet • 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 Arquitecturas de extensão do servidor HTTP 26 Uma aplicação ASP.Net é um conjunto de assemblies executados em determinado AppDomain do host aspnet_wp.exe 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 27 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) • ASP.NET – Fritz Onion, “Essential ASP.NET with Examples in C#”, Addison-Wesley, 2003 – Fritz Onion, “Essential ASP.Net 2.0”, Addison-Wesley, 2006 2007 - 2009 ©ISEL/DEETC/STI – Programação na Internet Arquitecturas de extensão do servidor HTTP 28