Adding Global Objects Application-Level Code and global.asax

305 Called by the ASP.NET framework when a session ends Application_OnStart Called by the ASP.NET framework when an application starts that is, when the applications first session starts Application_OnEnd Called by the ASP.NET framework when an application ends that is, when the applications last remaining session ends These four subroutines arent event handlers—they are simply subroutines that are automatically executed when present. They are typically used to set up and dispose of information needed at the session or application level. For example, an online shopping application could use the Application_OnStart subroutine to read popular product information from a database and cache it in the Application object, thereby improving performance for users of the application.

6.9.2 global.asax Compiles to a Class

The first time an application is accessed, its global.asax file is compiled into a class that inherits from the HttpApplication class defined in the System.Web namespace. The subroutines declared in global.asax become methods of the compiled class. Although the members of the HttpApplication class are not discussed further in this book, be aware that, if desired, those members can be accessed by code in global.asax. In addition, events exposed by the HttpApplication class can be handled by adding event handlers to global.asax. Each event handler must have the right signature, as defined by that events documentation and a Handles MyBase.EventName clause to register the handler with the event. Again, the events exposed by the HttpApplication class arent discussed further in this book. However, in case you would like to pursue it on your own, Ex am ple 6- 10 shows how such an event handler can be declared in global.asax. Example 6-10. Handling an HttpApplication class event in global.asax script language=vb runat=server ... Handle the base classs BeginRequest event. The name of the event handler is not important, but the signature and the Handles clause are. Private Sub HttpApplication_BeginRequest _ ByVal sender As Object, _ ByVal e As EventArgs _ Handles MyBase.BeginRequest ... End Sub script

6.9.3 Adding Global Objects

An application often needs to instantiate an object and make it available to all pages within a session or within the entire application. One way to do this is by instantiating the object in the Session_OnStart or Application_OnStart methods and saving the object reference in the ASP.NET Session or Application object, respectively. Pages can then read the object reference from the Session or Application object and use it as needed. 306 A slightly more convenient way to achieve a similar result is to place an object element in the global.asax file. The object element indicates that an instance of the given class should be created and made available to all pages in the session or application depending on the attributes specified. ASP.NET makes the object available to all pages in the application by adding a property to every page in the application. The property is named identically to the ID attribute of the object element. For example, here is an object element that creates a Hashtable object that is available application-wide: object id=myHashtable runat=server scope=Application class=System.Collections.Hashtable This declaration specifies the following: • An instance of the Hashtable class defined in the System.Collection namespace will be created class=System.Collections.Hashtable . • This single instance of the Hashtable class will be shared by all pages in the application scope=Application . If there is to be a separate instance for each session, specify scope=Session . • A property named myHashtable will be added to every page in the application to permit web page code easy access to the object id=myHashtable . Code to access the object instance from a web page would look like this: Page Language=vb script runat=server Protected Overrides Sub OnLoadByVal e As EventArgs Do something with the object created in global.asax. myHashtable.AddSomeKey, SomeValue End Sub script ... The property that is automatically compiled into the page in this case, the myHashtable property is compiled into the class that is compiled from the .aspx file. It is not compiled into the pages code- behind class if there is one. This means that the property is available to code that is embedded in the .aspx file, but not to code in the code-behind class. All objects created as a result of object elements appearing in global.asax are added to the StaticObjects collection of either the Session object or the Application object depending on the value specified for the scope attribute of the object element. For example, the myHashtable object could be accessed in this way: Page Language=vb script runat=server Protected Overrides Sub OnLoadByVal e As EventArgs Do something with the object created in global.asax. Dim ht As Hashtable ht = CTypeApplication.StaticObjectsmyHashTable, Hashtable ht.Addfoo, bar End Sub script 307 ... This has the advantage of also working from the code-behind class, or from any code that has access to the ASP.NET Application or Session object.

6.10 Web-Application Security