Friday, August 24, 2007

Profiles

·

ASP.NET 2.0 represents a substantial improvement in the area of personalized Web sites. In addition to the membership features weve already covered, ASP.NET profiles, themes, and Web parts significantly enhance personalization in Web sites.

ASP.NET Profiles


ASP.NET profiles are similar to sessions. The difference is that a profile is persistent whereas a session is lost when the browser is closed. Another big difference between sessions and profiles is that profiles are strongly typed, therefore providing you with IntelliSense during the development process.

A profile is defined in either the machines configuration file or the web.config file for the application. (You cannot define a profile in a sub-folders web.config file.) The code below defines a profile to store the Web site visitors first and last name.

<profile>
<properties>
<add name="FirstName" />

<add name="LastName" />
</properties>
</profile>
The default data type for a profile property is System.String. In the above example, no data type was specified. Therefore the FirstName and LastName properties are both of type String. As previously mentioned, profile properties are strongly typed. The code below adds a new property for age that is of type Int32.

<profile>
<properties>

<add name="FirstName" />
<add name="LastName" />
<add name="Age" type="Int32"/>
</properties>

</profile>

Profiles are generally used with ASP.NET Forms authentication. When used in combination with Forms authentication, each user has a separate profile associated with their user ID. However, it is also possible to allow the use of profiles in an anonymous application using the element in the configuration file along with the allowAnonymous attribute as shown below:

<anonymousIdentification enabled="true" />

<profile>
<properties>
<add name="FirstName" allowAnonymous="true" />
<add name="LastName" allowAnonymous="true" />
</properties>
</profile>


When an anonymous user browses the site, ASP.NET creates an instance of ProfileCommon for the user. This profile uses a unique ID stored in a cookie on the browser to identify the user as a unique visitor. In this way, you can store profile information for users who are browsing anonymously.

Profile Groups


It is possible to group properties of profiles. By grouping properties, it is possible to simulate multiple profiles for a specific application.

The following configuration configures a FirstName and LastName property for two groups; Buyers and Prospects.



<profile>

<properties>
<group name="Buyers">
<add name="FirstName" />
<add name="Lastname" />
<add name="NumberOfPurchases" type="Int32" />

</group>
<group name="Prospects">
<add name="FirstName" />
<add name="Lastname" />
</group>
</properties>

</profile>


It is then possible to set properties on a particular group as follows:

Profile.Buyers.NumberOfPurchases += 1;

Storing Complex Objects

So far, the examples we've covered have stored simple data types in a profile. It is also possible to store complex data types in a profile by specifying the method of serialization using the serializeAs attribute as follows:

<add name="PurchaseInvoice"
type="PurchaseInvoice"
serializeAs="Binary"
/>


In this case, the type is PurchaseInvoice. The PurchaseInvoice class needs to be marked as serializable and can contain any number of properties. For example, if PurchaseInvoice has a property called NumItemsPurchased, you can refer to that property in code as follows:

Profile.PurchaseInvoice.NumItemsPurchased

Profile Inheritance


It is possible to create a profile for use in multiple applications. By creating a profile class that derives from ProfileBase, you can reuse a profile in several applications by using the inherits attribute as shown below:

<profile inherits="PurchasingProfile" />


In this case, the class PurchasingProfile would look
like so:
using System;
using System.Web.Profile;
public class PurchasingProfile : ProfileBase {
private string _ProductName;
private Int32 _ProductID;
public string ProductName {
get { return _ProductName; }
set { _ProductName = value; }
}
public Int32 ProductID {
get { return _ProductID; }
set { _ProductID = value; }
}
}



Profile Providers

ASP.NET profiles use the provider model. The default provider stores the information in a SQL Server Express database in the App_Data folder of the Web application using the SqlProfileProvider provider. If the database doesn't exist, ASP.NET will automatically create it when the profile attempts to store information.

In some cases, however, you may want to develop your own profile provider. The ASP.NET profile feature enables you to easily use different providers.

You create a custom profile provider when:

  • You need to store profile information in a data source, such as in a FoxPro database or in an Oracle database, that is not supported by the profile providers included with the .NET Framework.
  • You need to manage profile information using a database schema that is different from the database schema used by the providers included with the .NET Framework. A common example is that you want to integrate profile information with user data in an existing SQL Server database.

Required Classes

To implement a profile provider, you create a class that inherits the System.Web.Profile.ProfileProvider abstract class. The ProfileProvider abstract class in turn inherits the System.Configuration.SettingsProvider abstract class, which inherits the System.Configuration.Provider.ProviderBase abstract class. Because of this inheritance chain, in addition to the required members of the ProfileProvider class, you must implement the required members of the SettingsProvider and ProviderBase classes.

The following tables describe the properties and methods that you must implement from the ProviderBase, SettingsProvider, and ProfileProvider abstract classes.

ProviderBase Members





MemberDescription
Initialize methodTakes as input the name of the provider instance and a
NameValueCollection of configuration settings. Used to set options and
property values for the provider instance, including implementation-specific
values and options specified in the machine configuration or Web.config file.


SettingsProvider Members



















MemberDescription
ApplicationName propertyThe application name that is stored with each profile. The
profile provider uses the application name to store profile information
separately for each application. This enables multiple ASP.NET applications
to use the same data source without a conflict if the same user name is
created in different applications. Alternatively, multiple ASP.NET
applications can share a profile data source by specifying the same
application name.
GetPropertyValues methodTakes as input a SettingsContext and a
SettingsPropertyCollection object.

The SettingsContext provides information about the
user. You can use the information as a primary key to retrieve profile
property information for the user. Use the SettingsContext object to
get the user name and whether the user is authenticated or anonymous.

The SettingsPropertyCollection contains a
collection of SettingsProperty objects. Each SettingsProperty object
provides the name and type of the property as well as additional information
such as the default value for the property and whether the property is
read-only. The GetPropertyValues method populates a
SettingsPropertyValueCollection with SettingsPropertyValue objects based on
the SettingsProperty objects provided as input. The values from the
data source for the specified user are assigned to the PropertyValue
properties for each SettingsPropertyValue object and the entire
collection is returned.

Calling the method also updates the LastActivityDate value
for the specified user profile to the current date and time.
SetPropertyValues methodTakes as input a SettingsContext and a
SettingsPropertyValueCollection object.

The SettingsContext provides information about the
user. You can use the information as a primary key to retrieve profile
property information for the user. Use the SettingsContext object to
get the user name and whether the user is authenticated or anonymous.
The SettingsPropertyValueCollection contains a
collection of SettingsPropertyValue objects.
Each SettingsPropertyValue
object provides the name, type, and value of the property as well as
additional information such as the default value for the property and whether
the property is read-only. The SetPropertyValues method updates the
profile property values in the data source for the specified user.

Calling the method also updates the LastActivityDate
and LastUpdatedDate values for the specified user profile to the current date
and time.


ProfileProvider Members









































MemberDescription
DeleteProfiles methodTakes as input a string array of user names and deletes
from the data source all profile information and property values for the
specified names where the application name matches the ApplicationName

property value.
If your data source supports transactions, it is
recommended that you include all delete operations in a transaction and that
you roll back the transaction and throw an exception if any delete operation
fails.
DeleteProfiles methodTakes as input a collection of ProfileInfo objects and
deletes from the data source all profile information and property values for
each profile where the application name matches the
ApplicationName property value.
If your data source supports transactions, it is
recommended that you include all delete operations in a transaction and roll
back the transaction and throw an exception if any delete operation fails.
DeleteInactiveProfiles methodTakes as input a ProfileAuthenticationOption value and a
DateTime object and deletes from the data source all profile information and
property values where the last activity date is less than or equal to the
specified date and time and where the application name matches the
ApplicationName property value.
The ProfileAuthenticationOption parameter specifies
whether only anonymous profiles, only authenticated profiles, or all profiles
are to be deleted.

If your data source supports transactions, it is
recommended that you include all delete operations in a transaction and roll
back the transaction and throw an exception if any delete operation fails.
GetAllProfiles methodTakes as input a ProfileAuthenticationOption value,
an integer that specifies the page index, an integer that specifies the page
size, and a reference to an integer that will be set to the total count of
profiles. Returns a ProfileInfoCollection that contains ProfileInfo
objects for all profiles in the data source where the application name
matches the ApplicationName property value. The
ProfileAuthenticationOption

parameter specifies whether only anonymous profiles, only authenticated
profiles, or all profiles are to be returned.

The results returned by the GetAllProfiles method
are constrained by the page index and page size values. The page size value
specifies the maximum number of ProfileInfo objects to
return in the ProfileInfoCollection.
The page index value specifies which page of results to return, where 1
identifies the first page. The parameter for total records is an out
parameter (you can use ByRef in Visual Basic) that is set to the total
number of profiles. For example, if the data store contains 13 profiles for
the application and the page index value is 2 with a page size of 5, the
ProfileInfoCollection

returned contains the sixth through the tenth profiles. The total records
value is set to 13 when the method returns.
GetAllInactiveProfiles methodTakes as input a ProfileAuthenticationOption value,
a DateTime object, an integer that specifies the page index, an
integer that specifies the page size, and a reference to an integer that will
be set to the total count of profiles. Returns a ProfileInfoCollection

that contains ProfileInfo objects for all profiles in the data source
where the last activity date is less than or equal to the specified DateTime
and where the application name matches the ApplicationName property
value. The ProfileAuthenticationOption parameter specifies whether
only anonymous profiles, only authenticated profiles, or all profiles are to
be returned.

The results returned by the GetAllInactiveProfiles

method are constrained by the page index and page size values. The page size
value specifies the maximum number of ProfileInfo objects to return in
the ProfileInfoCollection. The page index value specifies which page
of results to return, where 1 identifies the first page. The parameter for
total records is an out parameter (you can use ByRef in Visual Basic)
that is set to the total number of profiles. For example, if the data store
contains 13 profiles for the application and the page index value is 2 with a
page size of 5, the ProfileInfoCollection returned contains the sixth
through the tenth profiles. The total records value is set to 13 when the
method returns.
FindProfilesByUserName methodTakes as input a ProfileAuthenticationOption value,
a string containing a user name, an integer that specifies the page index, an
integer that specifies the page size, and a reference to an integer that will
be set to the total count of profiles. Returns a ProfileInfoCollection
that contains ProfileInfo objects for all profiles in the data source
where the user name matches the specified user name and where the application
name matches the ApplicationName property value.
The ProfileAuthenticationOption

parameter specifies whether only anonymous profiles, only authenticated
profiles, or all profiles are to be returned.

If your data source supports additional search
capabilities, such as wildcard characters, you can provide more extensive
search capabilities for user names.

The results returned by the FindProfilesByUserName
method are constrained by the page index and page size values. The page size
value specifies the maximum number of ProfileInfo objects to return in
the ProfileInfoCollection. The page index value specifies which page
of results to return, where 1 identifies the first page. The parameter for
total records is an out parameter (you can use ByRef in Visual Basic)
that is set to the total number of profiles. For example, if the data store
contains 13 profiles for the application and the page index value is 2 with a
page size of 5, the ProfileInfoCollection returned contains the sixth
through the tenth profiles. The total records value is set to 13 when the
method returns.
FindInactiveProfilesByUserName methodTakes as input a ProfileAuthenticationOption value,
a string containing a user name, a DateTime object, an integer that
specifies the page index, an integer that specifies the page size, and a
reference to an integer that will be set to the total count of profiles.
Returns a ProfileInfoCollection that contains
ProfileInfo

objects for all profiles in the data source where the user name matches the
specified user name, where the last activity date is less than or equal to
the specified DateTime, and where the application name
matches the ApplicationName
property value. The ProfileAuthenticationOption parameter specifies
whether only anonymous profiles, only authenticated profiles, or all profiles
are to be returned.

If your data source supports additional search
capabilities, such as wildcard characters, you can provide more extensive
search capabilities for user names.

The results returned by the FindInactiveProfilesByUserName

method are constrained by the page index and page size values. The page size
value specifies the maximum number of ProfileInfo objects to return in
the ProfileInfoCollection. The page index value specifies which page
of results to return, where 1 identifies the first page. The parameter for
total records is an out parameter (you can use ByRef in Visual Basic)
that is set to the total number of profiles. For example, if the data store
contains 13 profiles for the application and the page index value is 2 with a
page size of 5, the ProfileInfoCollection returned contains the sixth
through the tenth profiles. The total records value is set to 13 when the
method returns.
GetNumberOfInActiveProfiles methodTakes as input a ProfileAuthenticationOption value
and a DateTime object and returns a count of all profiles in the data
source where the last activity date is less than or equal to the specified DateTime
and where the application name matches the ApplicationName property
value. The ProfileAuthenticationOption parameter specifies whether
only anonymous profiles, only authenticated profiles, or all profiles are to
be counted.


ApplicationName

Because profile providers store profile information

separately for each application, you must ensure that your data schema includes
the application name and that queries and updates also include the application
name. For example, the following command is used to retrieve a property value
from a database based on the user name and whether the profile is anonymous,
and ensures that the ApplicationName value
is included in the query.



SELECT Property
FROM PropertyTable
WHERE Username = 'user1'
AND IsAnonymous = False
AND ApplicationName = 'MyApplication'

0 comments: