ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis...

34
ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - [email protected] Carlos Guedes – [email protected]

Transcript of ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis...

Page 1: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

ASP.NET

HTTP Pipeline

Programação na Internet Secção de Programação

ISEL-DEETC-LEICLuis Falcão - [email protected]

Carlos Guedes – [email protected]

Page 2: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Autores e contributos• Autores

– Luís Falcão

• Contributos– Paulo Pereira– Pedro Félix– Jorge Martins– Carlos Guedes– Nuno Datia

Page 3: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

3\

Agenda• HTTP Pipeline

– Pontos de extensibilidade• HttpHandler

• HttpApplication

• HttpModule

– Gestão de estado– Aspectos de implementação

Page 4: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

4

HTTP Pipeline – Pontos de extensibilidade

Cliente HTTPCliente HTTP

Servidor HTTP hospedeiroServidor HTTP hospedeiro

ASP.NET runtimeASP.NET runtime

AppDomain

AppDomain

AppDomain

AppDomain

App DomainApp Domain

HttpModule 2HttpModule 2

HttpModule 3HttpModule 3

Handler 2Handler 2 Handler 3Handler 3

HttpApplicationHttpApplication

HttpModule 1HttpModule 1

Handler 1Handler 1

Page 5: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

5

Custom Handlers• Para definição de novos endpoints no atendimento de pedidos HTTP

• Definidos com classes que implementam a interface IHttpHandler

• Associação URL handler especificada via ficheiros de configuração– Implica a configuração do hospedeiro da infra-estrutura ASP.NET

• São, em alternativa, definidos através de ficheiros *.ashx– Não implica a configuração do hospedeiro (caso seja o IIS)

public interface System.Web.IHttpHandler{

void ProcessRequest(HttpContext context);bool IsReusable { get; }

}

public interface System.Web.IHttpHandler{

void ProcessRequest(HttpContext context);bool IsReusable { get; }

}

Page 6: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

CalcHandler

Page 7: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Demo: CalcHandlerusing System.Web;public class CalcHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { int a = int.Parse(context.Request["a"]); int b = int.Parse(context.Request["b"]); switch(context.Request ["op"]) { case "add": context.Response.Write(a + b);

break; case "subtract": context.Response.Write(a - b);

break; case "multiply": context.Response.Write(a * b);

break; default: context.Response.Write("Unrecognized operation");

break; } } // ...}

using System.Web;public class CalcHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { int a = int.Parse(context.Request["a"]); int b = int.Parse(context.Request["b"]); switch(context.Request ["op"]) { case "add": context.Response.Write(a + b);

break; case "subtract": context.Response.Write(a - b);

break; case "multiply": context.Response.Write(a * b);

break; default: context.Response.Write("Unrecognized operation");

break; } } // ...}

calcHandler.cs

<configuration> <system.web> <httpHandlers > <add verb="GET" path="calculadora.calc"

type="CalcHandler" /> </httpHandlers> </configuration></system.web>

<configuration> <system.web> <httpHandlers > <add verb="GET" path="calculadora.calc"

type="CalcHandler" /> </httpHandlers> </configuration></system.web>

web.config

Exemplo:

http://localhost/site1/calculadora.calc?a=2&b=4&op=add

Page 8: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Demo: Ficheiros *.ASHX<!— file: calc.ashx —><%@ WebHandler language="C#" class="CalcHandler" %>

using System.Web;public class CalcHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { int a = int.Parse(context.Request["a"]); int b = int.Parse(context.Request["b"]); switch(context.Request ["op"]) { case "add": context.Response.Write(a + b);

break; case "subtract": context.Response.Write(a - b);

break; case "multiply": context.Response.Write(a * b);

break; default: context.Response.Write("Unrecognized operation");

break; } } // ...}

<!— file: calc.ashx —><%@ WebHandler language="C#" class="CalcHandler" %>

using System.Web;public class CalcHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { int a = int.Parse(context.Request["a"]); int b = int.Parse(context.Request["b"]); switch(context.Request ["op"]) { case "add": context.Response.Write(a + b);

break; case "subtract": context.Response.Write(a - b);

break; case "multiply": context.Response.Write(a * b);

break; default: context.Response.Write("Unrecognized operation");

break; } } // ...}

calculadora.ashx

NOTA: Não é preciso configurar este handler no ficheiro de configuração da aplicação web.config

NOTA: Não é preciso configurar este handler no ficheiro de configuração da aplicação web.config

Exemplo:http://localhost/site1/calculadora.ashx?

a=2&b=4&op=add

Exemplo:http://localhost/site1/calculadora.ashx?

a=2&b=4&op=add

Page 9: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

Demo2

EchoHandler

WaterMarkHandler

EchoHandler

WaterMarkHandler

Page 10: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

10

HttpHandler Factory

• Fábrica de instâncias de HTTPHandler– Maior controlo sobre a criação e destruição das instâncias dos handlers

• É utilizada quando definida no web.config, em vez do handler

public interface IHttpHandlerFactory { IHttpHandler GetHandler(HttpContext ctx, string

requestType, string url, string translatedPath); void ReleaseHandler(IHttpHandler handler);}

public interface IHttpHandlerFactory { IHttpHandler GetHandler(HttpContext ctx, string

requestType, string url, string translatedPath); void ReleaseHandler(IHttpHandler handler);}

<configuration><system.web> <httpHandlers > <add verb="GET" path="calculadora.calc" type="CalcHandler" /> <add verb="GET" path="calculadora.calc" type="CalcHandlerFactory" /> </httpHandlers></configuration></system.web>

<configuration><system.web> <httpHandlers > <add verb="GET" path="calculadora.calc" type="CalcHandler" /> <add verb="GET" path="calculadora.calc" type="CalcHandlerFactory" /> </httpHandlers></configuration></system.web>

Quando usam a factory devem

remover esta linha.

Page 11: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

11

HTTP Pipeline – Pontos de extensibilidade

Cliente HTTPCliente HTTP

Servidor HTTP hospedeiroServidor HTTP hospedeiro

ASP.NET runtimeASP.NET runtime

App DomainApp Domain

HttpApplicationHttpApplication

HttpModule 1HttpModule 1

HttpModule 2HttpModule 2

HttpModule 3HttpModule 3

Handler 1Handler 1 Handler 2Handler 2 Handler 3Handler 3

AppDomain

AppDomain

AppDomain

AppDomain

Page 12: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

12

Custom HttpApplication• Para definição do primeiro nó da cadeia• Definido através do ficheiro Global.asax

• A classe produzida deriva de System.Web.HttpApplication• Oportunidade de captura de eventos globais

– De ciclo de vida (da aplicação)

• Início, terminação ordeira, excepção não tratada, etc...

– De atendimento de pedido

<%@ Application Language="C#" %><script runat="server">

void Application_Start(object sender, EventArgs e) { ... }void Application_End(object sender, EventArgs e) { ... }void Application_Error(object sender, EventArgs e) { ... }// Outros campos, propriedades ou métodospublic override void Init() { ... }

</script>

<%@ Application Language="C#" %><script runat="server">

void Application_Start(object sender, EventArgs e) { ... }void Application_End(object sender, EventArgs e) { ... }void Application_Error(object sender, EventArgs e) { ... }// Outros campos, propriedades ou métodospublic override void Init() { ... }

</script>

Page 13: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

13

Atendimento de pedido1. Recepção de pedido

2. Autenticação (durante e após) e Autorização (durante e após)

3. Verificação de existência de resposta em cache (durante e após)

4. Resolução URL handler (após)

5. Aquisição de estado de conversação (durante e após)

6. Execução de handler para produção de resposta (antes e após)

7. Actualização de estado de conversação (durante e após)

8. Actualização da cache com resposta, caso se aplique (durante e após)

9. Fim de atendimento

10. Envio de resposta para cliente (antes de cabeçalho e de conteúdo)

sequência de acções e eventos

Page 14: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

14

Atendimento de pedido (2)1. BeginRequest

2. AuthenticateRequest

3. PostAuthenticateRequest

4. AuthorizeRequest

5. PostAuthorizeRequest

6. ResolveRequestCache

7. PostResolveRequestCache After the PostResolveRequestCache event and before the PostMapRequestHandler event, an event handler (a page corresponding to the request URL) is created.

8. PostMapRequestHandler

9. AcquireRequestState

10. PostAcquireRequestState

11. PreRequestHandlerExecute The event handler is executed.

12. PostRequestHandlerExecute

13. ReleaseRequestState

14. PostReleaseRequestState After the PostReleaseRequestState event, response filters, if any, filter the output.

15. UpdateRequestCache

16. PostUpdateRequestCache

17. EndRequest

Fonte: http://msdn2.microsoft.com/library/system.web.httpapplication.aspx

Page 15: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

Demo3

“Calcular o tempo de processamento de um pedido, em HttpApplication”“Calcular o tempo de processamento de um pedido, em HttpApplication”

Page 16: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Eventos implícitos de HttpApplication• A maioria dos eventos de aplicação ocorre em cada pedido, excepto Error

e Disposed• Para adicionar um handler de evento

– Registar delegate no eventoapp.OnEvent += new EventHandler(object src, EventArgs args)

– Definir método com a assinatura void Application_event(object src, EventArgs args)

• Existem acontecimentos em HttpApplication que não são disponibilizados na forma de eventos da classe. Para adicionar handler:– Definir método cujos nomes correspondem a eventos, uma vez que estes são

chamados por outras classes do pipelineEvent Reason for FiringApplication_Start Application starting

Application_End Application ending

Session_Start User session begins

Session_End User session ends

Eventos de HTTPApplication:http://msdn2.microsoft.com/en-us/library/0dbhtdck.aspx

Page 17: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Outros Membros de HttpApplicationpublic class HttpApplication : IHttpAsyncHandler, IComponent{ // Properties public HttpApplicationState Application {get;} public HttpContext Context {get;} public HttpModuleCollection Modules {get;} public HttpRequest Request {get;} public HttpResponse Response {get;} public HttpServerUtility Server {get;} public HttpSessionState Session {get;} public IPrincipal User {get;}

// Methods // Called after modules initialization public virtual void Init(); // To preemptively terminate the Request public void CompleteRequest();

// ...}

public class HttpApplication : IHttpAsyncHandler, IComponent{ // Properties public HttpApplicationState Application {get;} public HttpContext Context {get;} public HttpModuleCollection Modules {get;} public HttpRequest Request {get;} public HttpResponse Response {get;} public HttpServerUtility Server {get;} public HttpSessionState Session {get;} public IPrincipal User {get;}

// Methods // Called after modules initialization public virtual void Init(); // To preemptively terminate the Request public void CompleteRequest();

// ...}

Page 18: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

18

HTTP Pipeline – Pontos de extensibilidade

Cliente HTTPCliente HTTP

Servidor HTTP hospedeiroServidor HTTP hospedeiro

ASP.NET runtimeASP.NET runtime

App DomainApp Domain

HttpApplicationHttpApplication

HttpModule 1HttpModule 1

HttpModule 2HttpModule 2

HttpModule 3HttpModule 3

Handler 1Handler 1 Handler 2Handler 2 Handler 3Handler 3

AppDomain

AppDomain

AppDomain

AppDomain

Page 19: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

19

Custom Modules (1)• Para definição de novos nós da cadeia de atendimento de pedidos HTTP

• Definidos com classes que implementam a interface IHttpModule

• Oportunidade para– Captura de eventos globais

• Através do registo na instância de HttpApplication

– Pré processamento de pedidos e pós processamento de respostas

• Cadeia especificada através de ficheiros de configuração

public interface System.Web.IHttpModule{

void Init(HttpApplication application);void Dispose();

}

public interface System.Web.IHttpModule{

void Init(HttpApplication application);void Dispose();

}

Page 20: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

20

Custom Modules (2)• A infra-estrutura ASP.NET utiliza módulos para:

– Autenticação– Autorização– Cache– Manutenção de estado de sessão out-of-process

Module PurposeOutputCacheModule Page-level output caching

SessionStateModule Out-of-process session state management

WindowsAuthenticationModuleClient authentication using integrated Windows authentication

FormsAuthenticationModuleClient authentication using cookie-based forms authentication

PassportAuthenticationModule

Client authentication using MS Passport

UrlAuthorizationModule Client authorization based on requested URL

FileAuthorizationModule Client authorization based on requested file

Módulos definidos pela plataforma ASP.NET

Page 21: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Construção de um Custom Module• Criar tipo que implementa IHttpModule

– Init() – Registar delegates em eventos de HttpApplication– Dispose() – Realizar processamento de terminação do módulo (caso exista)

• Registar o módulo no Web.config

public interface IHttpModule{ // Chamado quando o módulo é criado. Recebe como parâmetro uma // referência para a instância actual de HttpApplication void Init(HttpApplication context); // Chamado quando a aplicação está a ser terminada void Dispose();}

public interface IHttpModule{ // Chamado quando o módulo é criado. Recebe como parâmetro uma // referência para a instância actual de HttpApplication void Init(HttpApplication context); // Chamado quando a aplicação está a ser terminada void Dispose();}

<configuration><system.web> <httpModules> <add name=“someKey" type=“TimerModule, TimerModuleAssembly" /> </httpModules></configuration></system.web>

<configuration><system.web> <httpModules> <add name=“someKey" type=“TimerModule, TimerModuleAssembly" /> </httpModules></configuration></system.web>

Page 22: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

Demo4

a) “Calcular o tempo de processamento de um pedido, num módulo”b) “ApplicationOffline”a) “Calcular o tempo de processamento de um pedido, num módulo”b) “ApplicationOffline”

Page 23: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Características dos módulos • Pooling

– Os módulos são sempre reutilizados (contrariamente aos handlers cuja reutilização é controlada pela propriedade IsReusable).

– Por cada instância de HttpApplication criada, são criados os respectivos módulos dessa aplicação

– Nota: Não guardar estado em campos de instância dos módulos entre pedidos

• Módulos vs HttpApplication (Global.asax)

Característica HttpModule HttpApplicationÉ possível receber notificações para todos os eventos gerados pela aplicação ? Sim Sim

É possível receber eventos de início/fim de sessão/aplicação ?(Session_Start/_End) e (Application_Start/_End)

Não Sim

Pode ser instalado ao nível da máquina (partilhado por várias aplicações) ? Sim Não

Page 24: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

A “cola do pipeline”: HTTPContext• Uma instância de HTTPContext flui por todo o pipeline, contendo toda a

informação sobre cada pedido

• É parâmetro de vários métodos, incluindo o método ProcessRequest() de IHttpHandler

• Acessível em todo o pipeline e através das propriedades:– Page.Context, – HttpApplication.Context ou – HttpContext.Current

• Deve ser utilizado como o repositório por excelência, de dados relativos aos pedidos, pois é acessível aos intervenientes no HTTP Pipeline– Utilizando a colecção Items da instância de HTTPContext

Page 25: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Membros de HTTPContextNome Tipo DescriçãoCurrent (static) HttpContext Context for the request currently in progress

Application HttpApplicationState Application-wide property bag

ApplicationInstance HttpApplication Active application instance

Session HttpSessionState Per-client session state

Request HttpRequest HTTP request object

Response HttpResponse HTTP response object

User IPrincipal Security ID of the caller

Handler IHttpHandler Handler for the request

Items IDictionary Per-request property bag

Server HttpServerUtility HTTP server object

Error Exception Unhandled exception object

Cache Cache Application-wide cache

Trace TraceContext Trace class for diagnostic output

TraceIsEnabled Boolean Whether tracing is currently enabled

WorkerRequest HttpWorkerRequest The current worker request object

IsCustomErrorEnabled Boolean Whether custom error pages are currently enabled

IsDebuggingEnabled Boolean Whether the current request is in debug mode

IsInCancellablePeriod Boolean Whether the current request can still be cancelled

Page 26: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

26

HTTP Pipeline – Sequência de acções

AppDomain

HttpApplicationHttpApplication

Request

ProcessRequest

HttpApplicationStateHttpApplicationState

HttpRequestHttpRequest

HttpResponseHttpResponse

HttpSessionStateHttpSessionState

HttpContextHttpContext

IHttpHandlerIHttpHandler

Response

HttpRuntimeHttpRuntime

HttpApplicationFactory

HttpApplicationFactory

GetApplicationInstance

BeginProcessRequest

IHttpHandlerFactory

IHttpHandlerFactory

GetHandler

ProcessRequestHttpModulesHttpModules

<<returns>>

<<returns>>

(modelo)

4

1

2

3

5

6

7

8

Page 27: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

27

Agenda• HTTP Pipeline

– Pontos de extensibilidade• HttpHandler

• HttpApplication

• HttpModules

– Gestão de estado– Aspectos de implementação

Page 28: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

28

Gestão de estado• Estado de aplicação

– Utilização recomendada: read-only– Consequências de utilização indevida: redução de escalabilidade

• Estado de conversação (sessão)– Suportado pelo módulo SessionStateModule– Realização condicional da aquisição e libertação de estado de conversação

• IRequiresSessionState

• IReadOnlySessionState

– Alvo de reestruturação na versão 2.0• Arquitectura extensível (SPI)• Auto-detecção de existência de suporte para cookies no cliente

Page 29: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

Demo5

StateManagementStateManagement

Page 30: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

30

Estado de conversação sobre HTTP

Cliente HTTP

Cliente HTTP

Servidor HTTPhospedeiro

Servidor HTTPhospedeiro

ASP.NETruntimeASP.NETruntime

Pedido

Resposta (contém ID de Sessão)

Pedido (contém ID de Sessão)

Resposta (contém ID de Sessão)

IDIDIDID

Page 31: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

31

HTTP Pipeline – aspectos de implementação• Maximização do paralelismo através da redução da partilha de instâncias

– A cada pedido é atribuída uma nova cadeia de atendimento, com início em HttpApplication

• Técnicas usadas:– Instance pooling

• Conjunto de instâncias equivalentes• Dimensão do conjunto <= dimensão do ThreadPool

– Caching

• Onde são usadas?– Instance pooling para instâncias de HttpApplication e opcionalmente para

handlers (nas respectivas fábricas)– Caching para os restantes elementos do pipeline

• Quais as consequências?

Page 32: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

32

Auto-detecção de suporte para cookies (1)

Cliente HTTP

Cliente HTTP

Servidor HTTPhospedeiro

Servidor HTTPhospedeiro

ASP.NETruntime

ASP.NETruntime

GET /Site/Start.ashx HTTP/1.1

HTTP/1.1 302 FoundLocation: /Site/Start.ashx?AutoDetect=1Set-Cookie: AutoDetect=1;path=/

GET /Site/Start.ashx?AutoDetect=1 HTTP/1.1Cookie: AutoDetect=1

HTTP/1.1 200 OKSet-Cookie: SessionId=3as44as...;path=/

userAgent com suporte para cookies

Page 33: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

33

Auto-detecção de suporte para cookies (2)

Cliente HTTP

Cliente HTTP

Servidor HTTPhospedeiro

Servidor HTTPhospedeiro

ASP.NETruntime

ASP.NETruntime

GET /Site/Start.ashx HTTP/1.1

HTTP/1.1 302 FoundLocation: /Site/Start.ashx?AutoDetect=1Set-Cookie: AutoDetect=1;path=/

GET /Site/Start.ashx?AutoDetect=1 HTTP/1.1

HTTP/1.1 302 FoundLocation: /Site/(X(1)S(3as44as..))/Start.ashx?AutoDetect=1

GET /Site/(X(1)S(3as44as..))/Start.ashx?AutoDetect=1 HTTP/1.1

HTTP/1.1 200 OK

userAgent sem suporte para cookies

Page 34: ASP.NET HTTP Pipeline Programação na Internet Secção de Programação ISEL-DEETC-LEIC Luis Falcão - lfalcao@cc.isel.ipl.ptlfalcao@cc.isel.ipl.pt Carlos Guedes.

2007 - 2008©ISEL/DEETC/SP – Programação na Internet

Bibliografia• Fritz Onion,

“Essential ASP.NET with Examples in C#”, Addison-Wesley, 2003 - Capítulo 4

• MSDN: http://msdn2.microsoft.com/library/system.web.aspx