Post on 18-Apr-2015
Arquitecturas de extensão doArquitecturas de extensão doservidor HTTPservidor HTTP
CGI | ISAPI : ASP, ASP.NETCGI | ISAPI : ASP, ASP.NET
Programação na Internet Secção de Programação
ISEL-DEETC-LEICLuis Falcão - lfalcao@cc.isel.ipl.pt
Nuno Datia – datia@isel.ipl.pt
2© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Autores e contributosAutores e contributos
• Autores– Luís Falcão
• Contributos– Paulo Pereira– Pedro Félix– Jorge Martins– Carlos Guedes– Nuno Datia
3© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Arquitecturas de extensão do servidor HTTPArquitecturas de extensão do servidor HTTP
• CGI• ISAPI
– ASP– ASP.NET
4© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
5© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
6© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Criação dinâmica de recursos (com CGI)
1 - Mensagem HTTP (GET, POST)
ApresentaçãoApresentação
Web BrowserWeb
Server
CGIWeb Form
2 - Criação do Processo CGIparâmetros da mensagem HTTP passados por variáveis de ambiente (GET), ou pelo Standard Input (POST)
3- Recurso gerado (via Standard Output)
4- Resposta HTTP
7© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Variáveis de ambienteVariá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)
8© ISEL 2006/2007DEEC - LEIC – Programação na Internet
CGI via Forms (1)
Acede a um Form
Envia o Form
Utilizador faz submit do Form
Reencaminhamento para CGI
Processa os dados
envia para servidor (ou para cliente)Envio para
clienteOutput recebido
9© ISEL 2006/2007DEEC - LEIC – Programação na Internet
CGI via Forms (2)Um Form simplesUm 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
URL gerado:http://www.contoso.com/cgi-bin/convidados.exe? FirstName=Eusébio&LastName=Ferreira&Password=qwerty
10© ISEL 2006/2007DEEC - LEIC – Programação na Internet
#! /usr/local/bin/perlprint “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);
PERLPERLPERLPERL
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++C++C++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); }}
C#C#C#C#
11© ISEL 2006/2007DEEC - LEIC – Programação na Internet
CGI de echo
Os Forms podem simular uma sessão com estado(Hidden fields)Os Forms podem simular uma sessão com estado(Hidden fields)
Resultado Resultado no browserno browserResultado Resultado no browserno browser
12© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
Web Server
Extensão ISAPI(Dll)
Uma possível configuração…
13© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
14© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
15© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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"
16© ISEL 2006/2007DEEC - LEIC – Programação na Internet
• Sample ASP Page (SampleASP.asp)
Demo 1
<%@ 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>
17© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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>
18© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Arquitectura do IIS 5.0
InetInfo.exeInetInfo.exeInetInfo.exeInetInfo.exe
Isapi_1.dllIsapi_1.dll
HTTP HTTP RequestRequests & s & ResponsesResponses
DLLHost.exeDLLHost.exeDLLHost.exeDLLHost.exe
Named PipeNamed Pipe
• 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
SocketSocket
Kernel ObjectsKernel Objects
Isapi_Isapi_22.dll.dll
Isapi_1.dllIsapi_1.dll
Isapi_Isapi_33.dll.dll
19© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Hosting de aplicações no IIS 5.0
InetInfo.exeInetInfo.exeInetInfo.exeInetInfo.exe DLLHost.exeDLLHost.exeDLLHost.exeDLLHost.exe DLLHost.exeDLLHost.exeDLLHost.exeDLLHost.exe
Main ProcessMain Process Pooled ProcessPooled Process Isolated ProcessIsolated Process
Isolated Isolated ApplicationApplication......
App 1App 1
App nApp n......
App 1App 1
App nApp n
• 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
20© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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)
21© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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
22© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Hosting de ASP .NET no IIS 5.0
• 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
aspnet_wp.exeaspnet_wp.exeaspnet_wp.exeaspnet_wp.exeInetInfo.exeInetInfo.exeInetInfo.exeInetInfo.exe
aspnet_isapi.dllaspnet_isapi.dll
HTTP RequestHTTP Requests s & Responses& Responses
Named PipeNamed Pipe
SocketSocket
Kernel ObjectsKernel Objects
PagePageClassClass
IHttpHandlerIHttpHandler
23© ISEL 2006/2007DEEC - LEIC – Programação na Internet
Uma aplicação ASP.Net é um conjunto de assemblies executados em determinado AppDomain do host aspnet_wp.exe
24© ISEL 2006/2007DEEC - LEIC – Programação na Internet
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