ASP.NET Architecture
description
Transcript of ASP.NET Architecture
Delivering Excellence in Software Engineering
® 2006. EPAM Systems. All rights reserved.
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
® 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
® 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
® 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 %>
<% %>
<% %><% %> <% %>
<% %>
<% %>
® 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
® 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#' %>
<% %>
<% %><% %> <% %>
<% %>
<% %>
® 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, ...)
® 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
® 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)
® 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)
® 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)
® 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
® 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
® 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
® 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
® 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
® 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
® 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
® 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
® 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
® 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#" %>
<%
%>
® 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
® 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
® 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"%>
<% %>
® 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
® 2006. EPAM Systems. All rights reserved.
System.Web.UI.Page
EssentialAspDotNet.Architecture.SamplePage
ASP.CodeBehind_aspx
Class hierarchy created using code behind
® 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"%>
<% %>
® 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
® 2006. EPAM Systems. All rights reserved.
ReferencedAssembly(Original)
ShadowCopy (actually
loaded)
Fusion-manageddirectories
Copied byassembly
loaderShadowCopyDirectories
Shadow copy mechanism used by ASP.NET
® 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)
® 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
® 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" %>
® 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")
® 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" %>
® 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
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