ASP.NET Architecture

37
Delivering Excellence in Software Engineering ® 2006. EPAM Systems. All rights reserved. ASP.NET Architecture

description

ASP.NET Architecture. Dynamic Web Content. Dynamic web content has traditionally been generated using CGI, ISAPI, or ASP on Microsoft platforms The Common Gateway Interface (CGI) provides dynamic content by directly processing requests and issuing responses in a custom process - PowerPoint PPT Presentation

Transcript of ASP.NET Architecture

Page 1: ASP.NET Architecture

Delivering Excellence in Software Engineering

® 2006. EPAM Systems. All rights reserved.

ASP.NET Architecture

Page 2: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Dynamic Web Content

• Dynamic web content has traditionally been generated using CGI, ISAPI, or ASP on Microsoft platforms– The Common Gateway Interface (CGI) provides dynamic

content by directly processing requests and issuing responses in a custom process

– The Internet Services API provides similar capability through filter DLLs, reducing the overhead

– Active Server Pages (ASP) eliminates the need to author DLLs to provide dynamic content -- integrated server-side script generates HTML

Page 3: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ASP

• Active Server Pages (ASP) simplify common tasks ISAPI DLLs were being used for– ASP was introduced because web developers

were building ISAPI extension DLLs to perform things like database queries and posting back HTML

– Each different type of request required a new ISAPI extension DLL to be written

– ASP.DLL is a generic ISAPI DLL that reads .ASP files, parses and executes server side script blocks, and serves up result

Page 4: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ASP.NET == ASP.NExTversion

• ASP.NET is an evolution of the ASP and is just the next version of ASP– Same intrinsic objects available– Script and html can be mixed– Some ASP code can be ported with no changes– Server-side Javascript is still supported

Page 5: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Sample ASP file

<%@ 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>

server-side function

interspersedserver-sidescript

server-sideevaluationsyntax

server-sidedirective

test.asp

<%@ language=javascript %>

<% %>

<% %><% %> <% %>

<% %>

<% %>

Page 6: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Fundamental change

• ASP.NET is more than just the next version of ASP– Pages are compiled into assemblies improving

performance and diagnostics– Code-behind encourages better separation of

code from HTML– Extensible, server-side control architecture– Server-side data binding model– Form validation architecture– Web services allow assemblies to expose

themselves as SOAP servers

Page 7: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Sample ASP.NET file

<%@ Page Language='C#' %>

<script runat="server">int Add(int x, int y){ return x+y;}</script>

<html> <body><h1>Test ASP.NET Page</h1>

<h2>2+2=<%=Add(2,2)%></h2><table border="2"><% for (int 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>

server-side function

interspersedserver-sidescript

server-sideevaluationsyntax

server-sidedirective

test.aspx<%@ Page Language='C#' %>

<% %>

<% %><% %> <% %>

<% %>

<% %>

Page 8: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

What is ASP.NET?

• At a high level, ASP.NET is a collection of .NET classes that collaborate to process an HTTP request and generate an HTTP response– Some classes are loaded from system

assemblies– Some classes are loaded from GAC assemblies– Some classes are loaded from local assemblies– To work with ASP.NET, you must build your own

classes that integrate into its existing class structure

– Some of your classes will be in pre-built assemblies

– Some of your classes will be in assemblies generated implicitly from ASP.NET files (aspx, ashx, asmx, ...)

Page 9: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ASP.NET request processing

ASP.NET Worker Process

HTTP RequestGET /foo/foo.aspx

HTTP ResponseHTTP/1.1 200 OK ...

System Assemblies GAC Assemblies Local Assemblies

system.web.dll

system.data.dll

mscorsvr.dll

bargraph.dll

mygacutil.dll

acmeutil.dll

mypage.dll

32wie4kg.dll

myctrl.dll

AppDomain1

Page 10: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Pipeline architecture

• ASP.NET uses the CLR to replace IIS's ISAPI/ASP architecture– User-defined handler objects used to dispatch

HTTP requests– Requests dispatched through ASP.NET-provided

ISAPI extension (aspnet_isapi.dll)– Handlers run in an ASP.NET-provided worker

process (aspnet_wp.exe in IIS 5, w3wp.exe in IIS 6)

– Many IIS features bypassed in favor of ASP.NET-provided features (WAM-based process isolation, ASP object model, and session management)

Page 11: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

HttpPipeline architecture (IIS 5.0)

GET /foo/foo.aspx HTTP/1.1 200 OK ...

INETINFO.EXE (IIS 5.0)

aspnet_isapi.dll(ISAPI Extension)

aspnet_wp.exe(ASP.NET Worker Process)

named pipe connectionhandler

IHttpHandler

Web Server (Win2000, XP)

Page 12: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

HttpPipeline architecture (IIS 6.0)

GET /foo/foo.aspx HTTP/1.1 200 OK ...

w3wp.exe(ASP.NET Worker Process)

handlerIHttpHandler

Web Server (Win Server 2003)

kernel http.sys

aspnet_isapi.dll(ISAPI Extension)

w3wp.exe(ASP.NET Worker Process)

handlerIHttpHandler

Application Pool #1 Application Pool #2

aspnet_isapi.dll(ISAPI Extension)

Page 13: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Compilation vs. Interpretation

• When ASP.NET pages are first accessed, they are compiled into assemblies– Subsequent access loads the page directly

from the assembly– Eliminates inefficiencies of the scripting model

of ASP– No performance difference between compiled

components and embedded server-side code– Debugging tools shared with all .NET

development– Whenever you author a new .aspx file, you are

authoring a new class

Page 14: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Page compilation

• Every ASP.NET page is compiled into an assembly on first access– The generated assembly contains a

single class that derives from System.Web.UI.Page

– The generated Page-derived class is the file name of the page, replacing the "." with a "_" (like foo_aspx)

– The generated assembly is stored in the 'Temporary ASP.NET Files' directory on the server machine

Page 15: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

HTTP RequestGET /foo/foo.aspx IIS &

ASP.NETPageParser::GetCompiledPageInstance

Compiledassembly already

exists?

Locate foo.aspx

Generate Page-derivedclass foo_aspx from file

Compile to assembly

Create foo_aspxinstance

CallPage::ProcessRequest

HTTP ResponseHTTP/1.1 200 OK ...Content-Type: text/html;Content-Length: 300<html><body>...</body></html>

Page::ProcessRequestcalls

Page::RenderControl

yes

no

ASP.NET Page Compilation

Page 16: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ASP.NET basics

• Each ASP.NET page is parsed and compiled into a class that extends System.Web.UI.Page– Page class implements IHttpHandler– A lot of the Page class is dedicated to

forms/control processing– Exposes HttpContext properties as own

properties

Page 17: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

<!-- File: ShowPageType.aspx --><%@ Page Language='C#' %>

<html> <body><h2>Show Page Type</h2>

<% Response.Output.Write("<p>Page type {0}</p>", this.GetType()); Response.Output.Write("<p>Page base type {0}</p>", this.GetType().BaseType);%></body> </html>

.aspx type information

Page 18: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

System.Web.UI.Page

• The Page class provides facilities for rendering HTML– Response and Request objects are

available as properties of the class– Methods for rendering are provided– Events associated with generating the

page are defined

Page 19: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

class Page : TemplateControl, IHttpHandler{ // State management public HttpApplicationState Application {get;} public HttpSessionState Session {virtual get;} public Cache Cache {get;}

// Intrinsics public HttpRequest Request {get;} public HttpResponse Response {get;} public HttpServerUtility Server {get;} public string MapPath(string virtualPath);

// Client information public string ClientTarget {get; set;} public IPrincipal User {get;} //...}

System.Web.UI.Page - 1

Page 20: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

class Page : TemplateControl, IHttpHandler{ // Core public UserControl LoadControl(string virtualPath); public virtual ControlCollection Controls {get;} public override string ID { get; set;}

public bool IsPostBack {get;} protected virtual void RenderControl(HtmlTextWriter writer); // Events public event EventHandler Init; public event EventHandler Load; public event EventHandler PreRender; public event EventHandler Unload;

//...}

System.Web.UI.Page - 2

Page 21: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Class creation

• Classes created from .aspx files can be customized– Server-side script blocks are added to

the class definition• Member variables• Member functions

– Interspersed script is added to a 'Render' function• Executable code

Page 22: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

aspx == class

<%@ Page Language="C#" %><html><body><script language="C#" runat="server"> private ArrayList _values = new ArrayList(); private void PopulateArray() { _values.Add("v1"); _values.Add("v2"); _values.Add("v3"); _values.Add("v4"); }</script>

<h2>aspx==class!</h2><ul><% PopulateArray(); for (int i=0; i<_values.Count; i++) Response.Output.Write("<li>{0}</li>", _values[i]);%></ul> </body> </html>

member variable declarationmember function declaration

member function usage

member variable usage

<%@ Page Language="C#" %>

<%

%>

Page 23: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

<!-- SamplePage.aspx --><%@ Page Language="C#" %><html><body><script language="C#" runat=server> private ArrayList m_values = new ArrayList(); private void PopulateArray() { m_values.Add("v1"); m_values.Add("v2"); m_values.Add("v3"); m_values.Add("v4"); }</script>

<ul><% PopulateArray(); for (int i=0; i<m_values.Count; i++) Response.Output.Write( "<li>{0}</li>", m_values[i]);%></ul></body> </html>

// Machine-generated source file// ybngvkuj.0.csnamespace ASP { public class SamplePage_aspx : Page, IRequiresSessionState {

private ArrayList m_values = new ArrayList(); private void PopulateArray() { m_values.Add("v1"); m_values.Add("v2"); m_values.Add("v3"); m_values.Add("v4"); } public SamplePage_aspx() { /*...*/ }

private void __Render__control1( HtmlTextWriter __output, Control parameterContainer) { __output.Write( "<!-- SamplePage.aspx -->\r\n"); __output.Write( "\r\n<html><body>\r\n"); __output.Write("\r\n<ul>\r\n");

PopulateArray(); for (int i=0; i<m_values.Count; i++) Response.Output.Write( "<li>{0}</li>", m_values[i]);

__output.Write( "\r\n</ul> \r\n</body> </html>\r\n"); } //... }}

Server-side code placement in page compilation

Page 24: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Code behind

• In addition to customizing the generated Page class using embedded code, ASP.NET supports page inheritance– Technique of Page inheritance is called code-

behind– Supported through the Inherits attribute of

the Page directive– Promotes separation of code and presentation– Code-behind files can be pre-compiled and

placed in a directory named /bin at the top level of the application

– Code-behind files can be compiled on demand using the src attribute of the Page directive

Page 25: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

<%@ Page Language="C#" Inherits="EssentialAspDotNet.Architecture.SamplePage"%><html><body>

<h2>aspx==class!</h2><ul><% WriteArray(); %></ul> </body> </html>

Sample aspx file with code behind

<%@ Page Language="C#" Inherits="EssentialAspDotNet.Architecture.SamplePage"%>

<% %>

Page 26: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

namespace EssentialAspDotNet.Architecture{ public class SamplePage : Page { private ArrayList _values = new ArrayList(); public SamplePage() { _values.Add("v1"); _values.Add("v2"); _values.Add("v3"); _values.Add("v4"); }

protected void WriteArray() { for (int i=0; i<_values.Count; i++) Response.Output.Write("<li>{0}</li>", _values[i]); } }}

Sample code-behind file - SamplePage.cs

Page 27: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

System.Web.UI.Page

EssentialAspDotNet.Architecture.SamplePage

ASP.CodeBehind_aspx

Class hierarchy created using code behind

Page 28: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

<%@ Page Language="C#" src="SampleCodeBehind.cs" Inherits="EssentialAspDotNet.Architecture.SamplePage"%>

<html><body>

<h2>aspx==class!</h2><ul><% WriteArray(); %></ul> </body> </html>

Using src attribute to automatically compile code behind file

<%@ Page Language="C#" src="SampleCodeBehind.cs" Inherits="EssentialAspDotNet.Architecture.SamplePage"%>

<% %>

Page 29: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Shadow Copying

• All assemblies in the /bin directory are shadow copied– Placing assemblies in /bin makes them

available to all pages in that application– These assemblies are not referenced directly

by ASP.NET– Instead they are copied to an obscure location

prior to loading– If the original file ever changes, the file is re-

copied– Enables xcopy deployment

Page 30: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ReferencedAssembly(Original)

ShadowCopy (actually

loaded)

Fusion-manageddirectories

Copied byassembly

loaderShadowCopyDirectories

Shadow copy mechanism used by ASP.NET

Page 31: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

ASP->ASP.NET Migration

• Several options for migrating 'classic' ASP applications– Run ASP side-by-side with ASP.NET, developing

new pages/apps in ASP.NET• Quickest path, but session and application state is

not shared– Convert existing ASP pages to ASP.NET (but

keep using old libraries - ADO and msxml)• Access to COM libraries incurs interop boundary

crossing– Convert existing ASP pages to ASP.NET with

new libraries (ADO.NET and System.XML)

Page 32: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Converting ASP pages to ASP.NET

• Some pages can be converted by simply renaming to .aspx

• Most pages will need some 'touch up'– Many directives have been changed (or

removed)– VBScript is not directly supported (must be

VB.NET)– COM object interaction may require

ASPCOMPAT mode– Code block placement different in ASP.NET

Page 33: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Updating directives from ASP->ASP.NET

• Several directives in ASP are no longer supported– <% option explicit %>– <%@ language="vbscript" %>

• Instead, use equivalent ASP.NET directives/attributes– <%@ Page Language="VB"

Explicit="true" %>

Page 34: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Not VBScript = VB.NET

• Many language changes mean VBScript code needs to be updated– VB.NET doesn't support default properties

objRS("au_fname") => objRS.Fields("au_fname")– IsNull won't work when testing DB results

IsNull(dbField) => IsDBNull(dbField)– Let and Set are no longer supported

Set obj = CreateObject("xx") => obj = CreateObject("xx")

– Date() is no longer an expression (it is a type)Date() => DateTime.Now

– Parameters must be passed within parenthesesResponse.Write "hi" => Response.Write("hi")

Page 35: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Interacting with COM

• By default, ASP.NET applications will run in an MTA thread when accessing COM objects through interop– Many classic ASP components are STA-

threaded which means that all calls incur a thread-switch

– Avoid this by using the AspCompat attribute

<%@ Page AspCompat="true" %>

Page 36: ASP.NET Architecture

® 2006. EPAM Systems. All rights reserved.

Summary

• ASP.NET is an evolution of dynamic web page generation techniques

• All pages in ASP.NET are compiled assemblies• Code-behind is a useful technique for separating

code logic from presentation• Shadow copying enables 'xcopy' deployment• Migrating ASP applications typically requires

some explicit conversion on your part

Page 37: ASP.NET Architecture

Delivering Excellence in Software Engineering

® 2006. EPAM Systems. All rights reserved.

For more information, please contact:

Uladzimir TsikhonSoftware Engineering Manager, Belarus Recourse Development DepartmentEPAM Systems, Inc.Belarus, MinskPhone: +375(17) 2101662 ext 1756Fax: +375(17) 2101168Email: [email protected]://www.epam.com