Configuring the Profile Provider By default, profile data is stored in a Microsoft SQL Server Express database named ASPNETDB.mdf, located in your application’s root App_Data folder.. Ad
Trang 1LISTING 28.40 ManageProfiles.aspx
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
DateTime inactiveDate = DateTime.Now.AddMonths(-3);
void Page_PreRender()
{
lblProfiles.Text =
ProfileManager.GetNumberOfProfiles(
ProfileAuthenticationOption.All).ToString();
lblInactiveProfiles.Text =
ProfileManager.GetNumberOfInactiveProfiles(
ProfileAuthenticationOption.All, inactiveDate).ToString();
}
protected void btnDelete_Click(object sender, EventArgs e)
{
int results =
ProfileManager.DeleteInactiveProfiles(
FIGURE 28.10 Deleting inactive profiles
Trang 2ProfileAuthenticationOption.All, inactiveDate);
lblResults.Text = String.Format(“{0} Profiles deleted!”, results);
}
</script>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head id=”Head1” runat=”server”>
<title>Manage Profiles</title>
</head>
<body>
<form id=”form1” runat=”server”>
<div>
Total Profiles:
<asp:Label
id=”lblProfiles”
Runat=”server” />
<br />
Inactive Profiles:
<asp:Label
id=”lblInactiveProfiles”
Runat=”server” />
<br /><br />
<asp:Button
id=”btnDelete”
Text=”Delete Inactive Profiles”
Runat=”server” OnClick=”btnDelete_Click” />
<br />
<asp:Label
id=”lblResults”
EnableViewState=”false”
Runat=”server” />
</div>
</form>
</body>
</html>
The page in Listing 28.40 displays the total number of profiles and the total number of
inactive profiles An inactive profile is a profile that has not been accessed for more than
3 months The page also includes a Delete Inactive Profiles button that enables you to
remove the old profiles
Trang 3Configuring the Profile Provider
By default, profile data is stored in a Microsoft SQL Server Express database named
ASPNETDB.mdf, located in your application’s root App_Data folder If you want to store
profile data in another database in your network, you need to perform the following two
tasks:
1 Add the necessary database objects required by the profile object to the database
2 Configure your application to connect to the database
You can add the necessary database tables and stored procedures required by the Profile
object to a database by executing the aspnet_regsql command-line tool The
aspnet_regsql tool is located at the following path:
\WINDOWS\Microsoft.NET\Framework\[version]\aspnet_regsql.exe
NOTE
If you open the Visual Studio Command Prompt, you do not need to navigate to the
Microsoft.NET directory to execute the aspnet_regsql tool
If you execute this tool without supplying any parameters, the ASP.NET SQL Server Setup
Wizard launches This wizard guides you through the process of connecting to a database
and adding the necessary database objects
As an alternative to using the aspnet_regsql tool, you can install the necessary database
objects by executing the following two SQL batch files:
\WINDOWS\Microsoft.NET\Framework\[version]\InstallCommon.sql
\WINDOWS\Microsoft.NET\Framework\[version]\InstallProfile.sql
After you set up your database, you need to configure the default profile provider to
connect to the database The web configuration file in Listing 28.41 connects to a
data-base named MyDatadata-base on a server named MyServer
LISTING 28.41 Web.Config
<?xml version=”1.0”?>
<configuration>
<connectionStrings>
<add
name=”conProfile”
connectionString=”Data Source=MyServer;
Integrated Security=true;database=MyDatabase”/>
</connectionStrings>
<system.web>
Trang 4<profile defaultProvider=”MyProfileProvider”>
<properties>
<add name=”firstName” />
<add name=”lastName” />
</properties>
<providers>
<add
name=”MyProfileProvider”
type=”System.Web.Profile.SqlProfileProvider”
connectionStringName=”conProfile”/>
</providers>
</profile>
</system.web>
</configuration>
After you complete these configuration steps, all profile data is stored in a custom
database
Creating a Custom Profile Provider
The Profile object uses the Provider Model The ASP.NET Framework includes a single
profile provider, the SqlProfileProvider, that stores profile data in a Microsoft SQL
Server database In this section, you learn how to build a custom profile provider
One problem with the default SqlProfileProvider is that it serializes an entire profile
into a single blob and stores the blob in a database table column This means that you
can’t execute SQL queries against the properties in a profile In other words, the default
SqlProfileProvider makes it extremely difficult to generate reports off the properties
stored in a profile
In this section, we create a new profile provider that is modestly named the
BetterProfileProvider The BetterProfileProvider stores each Profile property in a
separate database column
Unfortunately, the code for the BetterProfileProvider is too long to place in this book
However, the entire source code is included on the website that accompanies this book
The BetterProfileProvider inherits from the base ProfileProvider class The two most
important methods that must be overridden in the base ProfileProvider class are the
GetPropertyValues() and SetPropertyValues() methods These methods are responsible
for loading and saving a profile for a particular user
Imagine that you want to use the BetterProfileProvider to represent a profile that
contains the following three properties: FirstName, LastName, and NumberOfVisits Before
you can use the BetterProfileProvider, you must create a database table that contains
three columns that correspond to these Profile properties In addition, the database table
must contain an int column named ProfileID
Trang 5You can create the necessary database table with the following SQL command:
CREATE TABLE ProfileData
{
ProfileID Int,
FirstName NVarChar(50),
LastName NVarChar(50),
NumberOfVisits Int
}
Next, you need to create a database table named Profiles This table is used to describe the
properties of each profile You can create the Profiles table with the following SQL
command:
CREATE TABLE Profiles
(
UniqueID IDENTITY NOT NULL PRIMARY KEY,
UserName NVarchar(255) NOT NULL,
ApplicationName NVarchar(255) NOT NULL,
IsAnonymous BIT,
LastActivityDate DateTime,
LastUpdatedDate DateTime,
)
After you create these two database tables, you are ready to use the
BetterProfileProvider The web configuration file in Listing 28.42 configures the
BetterProfileProvider as the default profile provider
LISTING 28.42 Web.Config
<?xml version=”1.0”?>
<configuration>
<connectionStrings>
<add
name=”conProfile”
connectionString=
“Data Source=.\SQLExpress;Integrated
➥Security=true;AttachDBFileName=|DataDirectory|ProfilesDB.mdf;User Instance=true”
/>
</connectionStrings>
<system.web>
<profile defaultProvider=”MyProfileProvider”>
<properties>
<add name=”FirstName” />
<add name=”LastName” />
<add name=”NumberOfVisits” type=”Int32” />
Trang 6</properties>
<providers>
<add
name=”MyProfileProvider”
type=”AspNetUnleashed.BetterProfileProvider”
connectionStringName=”conProfile”
profileTableName=”ProfileData” />
</providers>
</profile>
</system.web>
</configuration>
The BetterProfileProvider is configured with both a connectionStringName and
profileTableName attribute The connectionStringName points to the database that
contains the two database tables that were created earlier The profileTableName property
contains the name of the table that contains the profile data (This attribute defaults to
the value ProfileData, so it isn’t necessary here.)
After you configure the BetterProfileProvider, you can use it in a similar manner to the
default SqlProfileProvider For example, the page in Listing 28.43 displays the values of
the FirstName, LastName, and NumberOfVisits profile properties and enables you to
modify the FirstName and LastName properties
WARNING
The BetterProfileProvider has several important limitations It does not support
serialization, so you cannot use it with complex types such as a custom shopping cart
class It also does not support default values for Profile properties
LISTING 28.43 ShowBetterProfileProvider.aspx
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
void Page_PreRender()
{
Profile.NumberOfVisits++;
lblNumberOfVisits.Text = Profile.NumberOfVisits.ToString();
lblFirstName.Text = Profile.FirstName;
lblLastName.Text = Profile.LastName;
}
Trang 7protected void btnUpdate_Click(object sender, EventArgs e)
{
Profile.FirstName = txtNewFirstName.Text;
Profile.LastName = txtNewLastName.Text;
}
</script>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head id=”Head1” runat=”server”>
<title>Show BetterProfileProvider</title>
</head>
<body>
<form id=”form1” runat=”server”>
<div>
Number of Visits:
<asp:Label
id=”lblNumberOfVisits”
Runat=”server” />
<br />
First Name:
<asp:Label
id=”lblFirstName”
Runat=”server” />
<br />
Last Name:
<asp:Label
id=”lblLastName”
Runat=”server” />
<hr />
<asp:Label
id=”lblNewFirstName”
Text=”First Name:”
AssociatedControlID=”txtNewFirstName”
Runat=”server” />
<asp:TextBox
id=”txtNewFirstName”
Runat=”server” />
<br />
<asp:Label
id=”lblNewLastname”
Text=”Last Name:”
AssociatedControlID=”txtNewLastName”
Runat=”server” />
<asp:TextBox
Trang 8id=”txtNewLastName”
Runat=”server” />
<br />
<asp:Button
id=”btnUpdate”
Text=”Update”
OnClick=”btnUpdate_Click”
Runat=”server” />
</div>
</form>
</body>
</html>
The main advantage of the BetterProfileProvider is that you can perform SQL queries
against the data stored in the ProfileData table For example, the page in Listing 28.44
displays the contents of the ProfileData table in a GridView control (see Figure 28.11) You
can’t do this when using the default SqlProfileProvider because the SqlProfileProvider
stores profile data in a blob
FIGURE 28.11 Displaying a profile report
Trang 9LISTING 28.44 BetterProfileProviderReport.aspx
<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head id=”Head1” runat=”server”>
<title>BetterProfileProvider Report</title>
</head>
<body>
<form id=”form1” runat=”server”>
<div>
<h1>Activity Report</h1>
<asp:GridView
id=”grdProfiles”
DataSourceID=”srcProfiles”
Runat=”server” />
<asp:SqlDataSource
id=”srcProfiles”
ConnectionString=”<%$ ConnectionStrings:conProfile %>”
SelectCommand=”SELECT ProfileID,FirstName,LastName,NumberOfVisits
FROM ProfileData”
Runat=”server” />
</div>
</form>
</body>
</html>
Summary
In this chapter, you learned how to maintain state in your ASP.NET applications In the
first section, you learned how to create, modify, and delete browser cookies You learned
how you can take advantage of cookies when you need to add a small amount of data to
a browser You also learned how to preserve precious cookie space by creating
multival-ued cookies
Next, we examined the topic of Session state You learned how to take advantage of
Session state to store larger amounts of data than can be stored in a cookie You also
learned how to configure cookieless Session state so that Session state works even when
Trang 10a browser has cookies disabled We also discussed how to make Session state more robust
by storing Session state data in a Windows NT Service or a Microsoft SQL Server
data-base table
Finally, you learned how to use the Profile object to create a typed and persistent form of
Session state You learned how to enable anonymous profiles In the final section of this
chapter, we built a custom Profile provider that enables you to store Profile properties in
separate database table columns