* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download CIS 690 Project Report
Survey
Document related concepts
Transcript
CIS 690 IMPLEMENTATION PROJECT Content Management Systems using Custom Providers in ASP.NET 2.0 Under Guidance of Dr.Daniel A. Andresen Prashanth Palakollu Graduate Student (M.S.) [email protected] Abstract The aim of this paper is to discuss the implementation of the Custom Providers for Membership, Roles, WebParts, Profiles, Sitemap and Page features in ASP.NET 2.0 for Oracle Data source. It also focuses on the implementation of a Content Management Systems Portal using the built Custom Providers and other new features of ASP.NET 2.0 like Httphandlers, Httpmodules and Caching. The Performance results of this Portal under different load characteristics and the other new features of the newer version of ASP.NET are also discussed in detail. modify the user interface and only the providers for different services need to be changed to suit the appropriate Data source, as shown in Figure 1. A provider is a module or a contract that provides a uniform interface between the service and the data source. Providers abstract the physical storage media in a way similar to the device drivers for the hardware devices [1]. Figure 1: The Provider Model 1. Introduction 1.1 Objective The main objective of this project is to implement the Custom Providers for Oracle Data source using ASP.NET 2.0 technology. ASP.NET 2.0 ships in with the providers only for SQL Server, which are used by different services. This project aims to rewrite the providers for Oracle Data source and also understand and implement the new features available in ASP.NET 2.0, which are not available in ASP.NET 1.x. 1.2 Target Audience This project will help the K-State Research and Extension and Plant Diagnostic and Information Systems to use all the new features of ASP.NET 2.0 and help in the conversion of the existing ASP.NET 1.x portals to ASP.NET 2.0. 2. Motivation ASP.NET 2.0 includes a number of services like Membership, Roles, Profile, Personalisation and other services that store data in SQL Server database through the built in providers. In order to completely use the features of the newer version of ASP.NET, the providers for the services need to be written for Oracle Database. ASP.NET 1.x developers had to rewrite large portions of the user interface and the component files in order to change the Data source. But in ASP.NET 2.0, the services do not interact with the database directly, but use providers for interacting with the database. Hence whenever the Data source changes, it is not necessary to All the services in ASP.NET 2.0 are provider based and hence any change in the database, involves only changing the Providers from one data source to another data source. The user interface and the services need not be changed and only the appropriate provider needs to be changed. Because of the flexibility of ASP.NET 2.0, we can have each provider connecting to a different data source and a single application can make use of these providers, when data is stored in different databases. I also implemented the Custom Providers and the Custom Services like the Page Service which is not available in ASP.NET 2.0 and also used the Page Provider for connecting the Page Service with the Oracle Database. The implemented Content Management Systems Portal makes use of all these Providers using ASP.NET 2.0. 1 Also, ASP.NET 2.0 has a lot of new features like Caching, Httphandlers and Httpmodules which are far more efficient and are easier to implement than in ASP.NET 1.x. I used Httphandlers and Httpmodules for UrlRewriting and for implementing friendly names for the different pages of the Portal. I also implemented the Site Map provider using the database notifications feature of ODP.NET (Oracle Data Provider), which is efficient and faster than the other data access methods like ODBC and OLE DB, which are shown in figure 2. Figure 2: The different Data access methods follow an Html type of Declarative Programming, which helps in building pages with far less code than with the classic ASP, JSP or PHP. Also, ASP.NET 2.0 has much more newer and advanced features than ASP.NET 1.x like Master Pages, Themes, Skins, Profiles, Membership, Role, Profile, Web Parts, Caching etc. Web Parts help in building portal easily because of the built in functionality of the User Controls. 3.2 Oracle 10g Release 1. Oracle Database 10g Release 1 is the ideal database designed for enterprise grid computing. It is the most flexible and cost efficient way for managing large enterprise information. It provides a cost effective means for storing crucial data and also it has lot of quality and performance enhancement features compared to the existing versions of Oracle. Its other features include an easy installation procedure, reduced configuration features and management requirements, automatic performance diagnosis and SQL tuning. These automated management features help the DBA to improve efficiency. [6] 3.3 Project Resources used Resource Server Operating System Processor ODP.NET is far more efficient and also has a lot of extra features which are not available in the other two data access providers. 3. Resources Used 3.1 Technologies: Microsoft Visual Studio 2005 Microsoft .Net Framework 2.0, Microsoft Visual C #. Visual Studio 2005 is a complete set of development tools for building ASP.NET 2.0 applications, XML Web Services, desktop applications and mobile applications. Visual Basic, Visual C++, Visual C# and Visual J# use the same integrated development environment (IDE), which is helpful in sharing tools and creation of mixed language solutions. The .NET Framework is a multi language environment for building, deploying and running applications. It consists of three main parts:-Common Language Runtime, Unified Programming Classes and ASP.NET. ASP.NET 2.0 makes building web applications much easier and interesting. ASP.NET 2.0 server controls Backend Database Editor Framework Performance Tools Other tools Resource Name Personal Laptop Windows XP Professional with Service Pack 2 Pentium Centrino M CPU 1.73 GHZ, 512 MB RAM Oracle 10g Release 10g 1 Microsoft Visual Studio 2005, Macromedia Dream weaver Microsoft .Net Framework 2.0 NUnit 2.2.8, ANTS 1.7, Microsoft Application Test Center Microsoft Visio 2003, MS Paint, Microsoft Word 2003 4. Architecture The whole Provider model architecture is shown in Figure 3. ASP.NET applications use the services, which in turn use the providers as a contract between itself and the data source. The user interface does not use any database commands and is entirely dependent on the providers for database interaction. The built in providers are loaded, when the application uses them for the first time i.e. they undergo lazy initialization schema and the built in providers like the page providers are loaded when the application starts. Any kind of ASP.NET application can make use of the provider model, with the help of the built in and the custom providers. The provider uses both the Microsoft data access and ODP to connect to database for updating and querying. 2 Figure 3: Architecture Workstation Laptop Workstations Workstation Services are built in, except the Page Service, which in custom built to meet the client requirements. The services need not be changed, unlike the providers Web Server Boundary .aspx .ascx .ashx html ASP. NET 2.0 APPLICATIONS (.aspx, .ascx, .ashx, html) ASP. NET 2.0 in Services MEMBERSHIP ROLES WEB PARTS PROFILES PAGE SERVICE SITEMAP Providers IIS Web Server Oracle Membership Provider Oracle Roles Provider Oracle Personalization Provider Oracle Profiles Provider Oracle Page Provider Oracle Sitemap Provider Providers are custom built depending on the data source and the needs of the client Oracle 10G Database Database Server Microsoft Data Provider Oracle Data Provider 3 Figure 4: Database Design 4 5. Database Design 6. Functionality of the Providers The database design is shown in Figure 4. There are a total of thirteen tables in the Provider model for the 6 providers. The OracleMembershipProvider uses the 3 tables: Provider_Applications, Provider_Membership, and Provider_Users. The Provider model has been designed in a way to accommodate multiple portals in a single database. The Provider_Applications table is used for storing the details of individual portal like the site id, application name and description. Provider_Users acts like a linking table to the rest of the provider model and contains the fields, which are required by the other providers. Provider_Membership contains the details of the users of all the portals. Users of a particular portal are distinguished depending the site id and the user id. The OracleRoleProvider uses the Provider_Roles and the Provider_UIRoles (user in roles) tables in conjunction with the other tables. Provider_Roles contains the information about the roles in the different portals and the Provider_UIRoles contains the information of the roles of a particular user. OraclePersonalisationProvider primarily uses the three tables:Provider_Paths, Provider_PersonalisationPerUser and Provider_PersonalisationAllUsers for storing information about Web parts. Provider_Paths contains the information about the request paths for the individual state and also for the shared state. This table is used to store the settings of individual pages, so that the page settings of one page do not affect the other page. Provider_PersonalisationPerUser contains the page settings and the path settings of the Customizable Web parts of an individual User. Provider_PersonalisationAllUsers stores the information about the shared state of the portal settings. OracleProfileProvider stores the information and settings of the registered and anonymous users in a single table, Provider_Profiles. OraclePageProvider is the custom built provider to suit the needs of the client and requires all the other providers to implement its functionality. This provider uses mainly 3 tables: Provider_Page, Provider_Edit_Page_Roles, and Provider_View_Page_Roles. The Provider_Page contains information about all the pages in the Portal, Provider_Edit_Page_Roles and Provider_View_Page_Roles contain the information about the edit and the view roles of for each page. OracleSiteMapProvider uses the Provider_Page table to build the site map and to maintain the update, insert and delete operations to the site map. In addition to these tables, I have used Triggers, Sequences and Procedures to ensure the consistency of the database. 6.1 Introduction This provider model has been designed in a manner to make the ASP.NET storage flexible and to abstract the application level code. The code in the ASP.NET runtime is abstracted from the data source and only the code in the provider needs to be changed (minimum), when there is a change in the data source. Also it accommodates the use of different databases, so that information can be stored in other databases. In addition to these benefits, the user interface need not be changed at all, whenever the data source changes. All the Providers (custom and built in) inherit from the Provider Base class, which is the root class for all the Providers. It contains the name property and the initialize function, which need to be overridden in the derived class. The name property specifies the name for the provider and the initialize function is called by the ASP.NET runtime, when the provider is initialized. All the built in providers undergo lazy initialization schema i.e. they are instantiated when the application using them accesses it first. The Page provider (custom) is loaded when the application first loads using the Page Service class which reads the web.config file, to determine the parameters that needs to passed to the initialize function. In this project, Page Provider is derived from Provider Base and then OraclePageProvider is derived from the Page Provider. The other providers derive from classes inherited from Provider Base rather than directly deriving from the Provider Base class. Each of the Providers needs to be registered in the Providers section of the web.config file, which also includes the features and services of the providers. For example, the membership provider is registered as:<membership defaultProvider="OracleMembershipProvider"> <providers> <clear/> <add name="OracleMembershipProvider" type="OracleMembershipProvider, connectionStringName="ConnectionString1" applicationName="PDIS2"/> </providers> </membership> Membership element denotes the service and the default provider which uses the service. The add element registers the membership provider and it contains the other parameters necessary for the initialization of the Provider. There can be many providers for a service, but the service can use a single provider at a time (default provider denotes it). 5 Thread Safety All the providers need to follow certain rules to work in an efficient and thread safe manner. The initialize method, which is implemented by all providers, should ensure that that the provider has necessary permissions, so that exceptions are not thrown. Also the config parameter passed to the initialize function by the ASP.NET runtime should not be null. The initialize function should call the base class initialize function and is called every time the provider is initialized. All the configuration attributes need to be read and configured appropriately. The application name and the connection string should be present in the config parameter. The other issue is the thread safety of the providers. Unlike the Httpmodules and the Httphandlers which are instantiated per request, the providers are instantiated only once for the whole application life time and they are shared among all the requests. Since each request is processed on a different thread, different threads may be accessing the providers at the same time. Therefore, it is necessary that the providers are thread safe. Providers which are not thread safe may work properly in the beginning, but as the load on the system increases, it may lead to data corruption as different threads access the same provider. Therefore all the provider methods except the initialize method need to be thread safe. The initialize method is never executed simultaneously on two threads. All the parameters passed to the providers are obtained from the web.config file and hence only web.config file need to be changed and the providers need to intact. The providers make multiple updates to the database, hence I have used the concept of transactions, where a transaction is associated with a command and all the commands need to be executed properly for committing the transaction, else the transaction will be aborted. I have used System.Configuration.Provider namespace, which contains an exception class Provider Exception that all the providers throw upon exception. 6.2 OracleMembershipProvider OracleMembershipProvider class is inherited from the Membership Provider abstract class, which defines the interface between the membership service and the data source. All the methods in the Membership Provider class need to be overridden and the custom functions as per the client requirements were added into OracleMembershipProvider. The functionality of the membership provider is to act as an interface between the data source and the membership service, store the information regarding the site’s registered users, contains the methods for creating ,deleting ,updating users , authenticating users , encrypting passwords , decrypting passwords , changing passwords etc. Each user of the site is represented as a MembershipUser object, which contains the information regarding each individual users of the portal. All the membership providers have a property called application name, which is used for scoping the data that is managed by the provider. Applications that have same application name, share the same membership data. Thus we can have different applications in the same data source because the membership service uses the application name to scope the data. The different controls, which use the OracleMembershipProvider are the Login, Login View, PasswordRecovery, LoginStatus, LoginName, CreateUserWizard and ChangePassword controls as shown in Fig 5. Figure 5: Membership Provider Model OracleMembershipProvider supports different policies for password formats. This provider ensures that the password contains at least one alphanumeric character, a minimum password length of 6 characters and Password Strength regular expression support is also enabled. Also options for Password Reset, Question & Answer, Maximum Invalid Password Attempts and Password Retrieval can also be set in the provider. The provider supports 3 different password formats: Clear, Encrypted and Hashed. If password is hashed, then Password Retrieval is not possible. The hash algorithm type used by the provider is “SHA1”. Password can be changed to a random password generated by ASP.NET runtime, it can also be changed to a user defined password or the password can be sent to the user. This membership provider also supports account locking of a particular user, if the user is not active for a long period or has failed the login multiple times. A user will not be able to login back until his account is unlocked. The OracleMembershipProvider and the other providers make use of helper classes like the sec-util, Oracle Connection classes which help in validating the 6 parameters of the user creation, password creation, user updating functions etc. OracleProviderSchema class creates the tables for all the providers, when the portal is being setup for the first time. This class creates all the tables, procedures, sequences and triggers and also validates the tables, if the tables have already been established. 6.3 OracleRoleProvider OracleRoleProvider class is inherited from the Role Provider abstract class, which defines the interface between the role service and the data source. All the methods in the role Provider class need to be overridden and the custom functions as per the client requirements were added into OracleRoleProvider. The functionality of the role provider is to act as an interface between the data source and the roles service, to store the information regarding the different roles in the sites, contains the methods for creating, deleting, updating roles, adding users to roles, removing users from roles etc. Roles provider should be enabled by enabling the Role provider in the web.config. The role provider is scoped depending on the application name and hence the same data source can contain roles of different portals. The role manager is responsible for using the role provider in the ASP.NET configuration for implementing its functions. The Role Manager uses the different functions in the role provider to manage the roles as shown in the Fig 6. Figure 6: Role Provider Model class need to be overridden and the custom functions as per the client requirements were added into OracleProfileProvider. The main functionality of the profile provider is to write profile property values to the data source and read values back from the data source .The OracleProfileProvider also contains methods for creating profiles, loading profiles, deleting the inactive profiles, Getting all the Profiles, Getting the Property values ,Setting the Property values etc. Profile data is scoped by user name and hence the user has his profile stored separately. User name is used as the key to store the profile data, but for anonymous users, a randomly generated id is used for storing the profiles. The heart of the Profile provider is the two functions GetPropertyValues and SetPropertyValues. When GetPropertyValues function is called, username and a flag indicating the authentication state of the user is passed to the method. If the authentication is false, the then the user is anonymous else the user is registered. This method requests properties defined in the web.config file in the profile section which is declared as follows: <anonymousIdentification enabled="true"/> <profile defaultProvider="OracleProfleProvder"> <providers> <add name="OracleProfileProvider" type="OracleProfileProvider" connectionStringName="ConnectionString1" applicationName="PDIS2"/> </providers> <properties> <add name="Name" allowAnonymous="true"/> <add name="Age" allowAnonymous="true" type="System.Int16"/> </properties> </profile> The Name and the age of the user (authenticated and anonymous) is stored in the database. SetPropertyValues function is used to set the properties of the objects defined in the profile section. It uses the serialize and deserialize properties to store and retrieve the data from the objects created, when it is stored in the database. When requested, it provides serialized data to ASP.NET because sometimes not all properties may be needed. 6.4 OracleProfileProvider OracleProfileProvider class is inherited from the Profile Provider abstract class, which derives from SettingsProvider class. OracleProfileProvider class defines the interface between the profile service and the data source. All the methods in the SettingsProvider 6.5 OraclePersonalisationProvider OraclePersonalisationProvider class is inherited from the Personalisation Provider abstract class, which derives from Provider Base class. OraclePersonalisationProvider class defines the interface between the web part Personalisation service and the data source. The main functionality of the Personalisation provider is to store the Personalisation state about the layout of the web parts for different users in different pages in the database. The Personalisation service serializes and deserializes Personalisation state and returns the state to the provider as opaque bytes. The main function of this 7 provider is to transfer the array bytes to and from the database. OraclePersonalisation provider overrides the LoadPersonalisationBlobs, ResetPersonalisationBlobs, SavePersonalisationBlobs, FindState, ResetUserState, ResetState functions of the base provider. Web Parts Personalisation data is scoped by the username and the path because username allows to store the Personalisation state for each user and path allows storing the state of different pages for a particular user. In addition to user state, this provider also supports shared state, which is dependent of the path. Figure 7: Personalisation Provider Model 6.6 OracleSiteMapProvider OracleSiteMapProvider class is inherited from the StaticSiteMap Provider class (default implementations), which derives from SiteMapProvider class. OracleSiteMapProvider class defines the interface between the sitemap service and the data source. The main functionality of the OracleSiteMapProvider is to read the data from the data source and build an upside down tree of sitemap node objects and to provide methods for retrieving nodes from the database. Each sitemap node in the tree is represented as one node in the site map. Each node has title, url, parent node,roles and child node properties associated with it, which help in the navigation of the tree. Once the sitemap is built, it is cached in memory and the static site map provider does not load every time the application starts. The cache needs to be invalidated, in order to load the site map again. When the sitemap is initialized, a dependency is created on the site map stored in the cache. Whenever database changes i.e. invalidation occurs, ODP (Oracle Data Provider) raises a delegate which clears the cache dependency and the cache becomes invalidated, which loads the sitemap again. This is particularly useful in admin section of the portal, when pages need to be created and deleted very often. This provider makes use of the OracleCacheDependency class, which handles the notification from the database and clears the cache, once the cache is invalidated. Also the OracleSiteMapProvider supports security trimming i.e. nodes are visible to the user depending on the user roles. 6.7 OraclePageProvider OraclePageProvider is inherited from the Page Provider, which in turn derives from the Provider Base. Page Provider is an abstract class containing methods, which need to be implemented in OraclePageProvider. This Provider is based on a Custom Service i.e. Page Service unlike the other providers, which use built in services. OraclePageProvider contains methods for creating pages, deleting pages, changing the site properties, deleting pages (sending to recycle bin), deleting pages permanently, restoring pages from recycle bin and moving the pages up and down in the hierarchy. OraclePageProvider works in conjunction with the OracleSiteMapProvider, where a tree control is represented as the pages in the portal, and the tree control uses the Site map provider. To perform operations on the tree control, OraclePageProvider is used and for rebuilding the sitemap, OracleSiteMapProvider is used. This was the most difficult provider to write in the whole project as I had to learn lot of new concepts to implement this provider. (Caching, ODP, sitemap, initialization schemes, creating the service, and loading the providers). Figure 8: Page Provider Model Figures 9 and 10 show the class diagram for the whole provider model and pages layout and interaction with the various providers for the Admin section 8 Figure 9: Class Diagram (Provider Model) 9 Figure 10: Portal Admin Section Class Diagram ADMIN SECTION User_Control.ascx CreateUserWizard DeleteUser UpdateUser ChangePassword AddUserToRole MEMBERSHIP SERVICE Role_Control.ascx Page_Control.ascx Site_Control.ascx CreateRole DeleteRole RoleExists AddUsersToRoles UpdateDescriptionforRole GetDescription Get_RoleId updateRoleName RemoveUsersFromRoles CreatePage AddEditRolesToPages RemoveEditRolesFromPages AddViewRolesToPages RestorePagesFromRecycleBin DeletePagesFromRecycleBin DeletePage MovePage_Down MovePage_Up GetRoleId RoleExists AddUsersToRoles BuildSiteMap CreateRootNode GetPage GetSite UpdatePage UpdateSite ROLES SERVICE PAGE SERVICE SITEMAP SERVICE 10 7. Testing I have used Microsoft Application Center Test and ANTS Load (Advanced .NET testing system) to perform the Load testing for the portal built using the providers. Also, I performed NUnit testing to test the functions in the provider. I could not test all the functions in the Personalisation and profile provider because some of the functions were using clobs to store the data in the database. But, I could test all the other functions in other providers. NUnit is a unit testing Framework for all the .NET languages. It was initially imported from JUnit and is entirely written in C#. It has lot of features, which take advantage of the .NET language features like custom attributes and other reflection capabilities. [3] ANTS Load is used for determining a web applications performance under varying loads. It simulates multiple clients accessing the website at the same time and indicates the performance under these conditions. [4] Microsoft Application Center Test is used for performing stress tests to Web Server and determines the performance and scalability problems with the Applications. It simulates multiple users accessing the website by opening multiple connections and sending HTTP requests. [5] 7.1 NUnit Figure 11: NUnit Testing Snapshot A Green light indicates success, yellow indicates failure. All the functions need to return correct values, in order to get green light. Functions being tested by the NUnit. Different functions in the Membership, Roles, Page, Profile etc are being tested I used NUnit to perform the functional testing. I wrote test cases, which verify whether the value returned by a function is same as the one expected. I could write test cases for most of the functions, but for some functions, I could not verify the return value because I could not determine the value returned by the functions (clobs). A green light in the GUI indicates the test was successful and yellow indicates that it has failed. 11 Figure 13: Web Request – Time to connect 7.2 ANTS (Advanced .NET Testing System) Summary Information by Object This section shows the average timings for each object for this test. This can be used to find the fastest, and slowest, objects in the web application. Note that all timings are in milliseconds. # Name Time to Connect Time to first byte Time to last byte Bytes Received 1 2 Web Resource Default.aspx 3 99 3 99 3 105 264 18664 The average time taken to connect to the home page is 99ms as shown in the above figure. Also, the average time taken for the first and the last byte is 99 and 105 milliseconds .The time taken for the last byte is not very high , indicating that there were very less errors. Figure 14: Web Request – Time to last byte Figure 12: Web Request – Time to connect Figure 15: Web Request – Bytes received The time taken to connect for 58 requests is less than 50 milliseconds and the time taken to taken to connect some other requests is 200 to 300 seconds. The same performance is seen for the time taken for the last byte and time taken for the first byte. The total no of bytes received for 55 requests is in the range of 200 to 500. 12 7.3 Microsoft Application Center Test Using Microsoft Application Center Test, I simulated the web application’s performance under varying loads. VB Script is used as the language for creating the testing logic. As shown in the results summary, a total of 139,902 requests for made to the Web server. There was an average of 466 requests per second, the time taken for the first byte was 1.19 milliseconds and the time taken for the last byte was 1.24 milliseconds. If there were any errors, then the time taken for the last byte would have been really high, but it was very less in this case. 97.95 % of the times, the requests completed successfully, whereas 2.05 % of the requests received an error because of the changes in the URL. These errors were because every request did not get the same page and also the pages were requested depending on the tab ids of the pages and some of these tab ids did not exist. I performed these tests using the resources (Hardware & Software) mentioned in section 3.3, when the laptop was operating using the 802.11b wireless connection. As shown in the summary, a total of 825 MB of data was received in 270 seconds. A total of 573 test iterations were performed in 5 minutes. The average bandwidth was 3MBps in this test scenario. Figure 16: Microsoft Application Test Center Results Summary 13 8. Problems Faced 11. References a) Cache Dependency: For the OracleSiteMapProvider, built in features were available only for SQL Server for invalidating the cache. But very little documentation was available of Oracle. In order to invalidate the cache, I had to learn a lot of other features like ODP.NET for database invalidation, SQL Cache Dependency, security trimming etc. b) In the beginning, I could not understand how the initialize function for the provider was getting called. I had to go through a lot of documentation of the ASP.NET runtime to determine its working model. c) Implementation of the OraclePersonalisationProvider required a lot of additional helper functions, which had a lot of functionality for serializing and deserializing data. d) Very little documentation was available on the provider implementation for Oracle Databases. All the documentation available was for SQL Server. e) IIS (Internet Information Services) was giving me problems while installation of Visual Studio 2005 and also during the testing phase of the project. I could overcome this by reinstalling IIS. IIS on the laptop could accept only limited no of connections, hence testing was limited. [1] ASP.NET 2.0 Provider Model: Introduction to the Provider Model. (Microsoft Corporation, October 2005) http://msdn.microsoft.com/asp.net/downloads/providers/ default.aspx [2] Oracle Data Provider for .NET, Feature Overview. (Oracle, August 2002) http://www.oracle.com/technology/tech/windows/odpnet /ODP.NET-FOV.html [3] NUnit: http://www.nunit.org/ [4] ANTS (Advanced .NET Testing System) http://www.red-gate.com/products/ants_load/index.htm [5] Microsoft Application Test Center (Shrijeet Nair, 09/17/2002). http://www.c-sharpcorner.com /Code/2002/ Sept/ AppTestCenter.asp [6] Oracle 10g Features http://www.oracle.qassociates.co.uk/oracle-10g.htm 9. Lessons Learnt I started this project with a view to understand the internals of ASP.NET. During the course of implementing this project, I learnt a lot of new features of ASP.NET like Caching, Httphandlers, Httpmodules, the complete Provider model, the database – cache dependencies, IIS configuration issues, authentication & authorization in ASP.NET, Secured sockets layer, page life cycle and lot of other internals. I also wanted to learn AJAX, if time permitted. 10. Future Work There are a number of other providers like Session State, Web Events, and Module Providers that can be implemented. Also, the pages of the portal can be generated dynamically without having any physical page present. Depending on the URL, the Web parts can be loaded dynamically into the pages and the events can be handled in the component files. Web Parts are an important part of Visual Studio 2005 and there is a lot of scope in learning and implementing these Web parts. 14