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
Download

downloading