服務(wù)熱線
153 8323 9821
Profile 類時(shí)用于用戶 Profile 的創(chuàng)建和 Profile 事件的管理的,
當(dāng)啟用用戶配置文件時(shí),ASP.NET 使用 ProfileModule 來(lái)創(chuàng)建用戶配置文件,
并且將其存儲(chǔ)在當(dāng)前的 HttpContext 的 Profile 屬性中
public sealed class ProfileModule : IHttpModule
從這里的對(duì) ProfileModule 的定義可以看出,
這個(gè) ProfileModule 是實(shí)現(xiàn)了 IHttpModule 接口的,
同時(shí)其也是一個(gè)葉子類,也就是不允許繼承,
既然其實(shí)現(xiàn)了 IHttpModule 接口的話,那么它便可以攔截住任何的 Request ,
并且可以對(duì)這些攔截的 Request 進(jìn)行修改和控制后再傳遞給 ASP.NET 處理,
還有需要說(shuō)明的就是這個(gè) ProfileModule 還公開了三個(gè)事件
MSDN 中的說(shuō)法是
ProfileModule 公開下面的事件,
您可以處理這些事件以在應(yīng)用程序中配置身份驗(yàn)證:
MigrateAnonymous 事件,
用于在匿名用戶登錄時(shí)將配置文件設(shè)置從匿名配置文件
遷移到經(jīng)過(guò)身份驗(yàn)證的配置文件。
Personalize 事件,用于自定義如何創(chuàng)建用戶配置文件。
ProfileAutoSaving 事件,
用于在 AutomaticSaveEnabled 屬性設(shè)置為 true 時(shí)
控制如何保存用戶配置文件。
上面的三個(gè)事件呢,其實(shí)有一個(gè)事件我在上一篇博文中已經(jīng)詳細(xì)的介紹了,
就是從匿名狀態(tài)轉(zhuǎn)換到登錄狀態(tài)時(shí)使用的事件 Profile_MigrateAnonymous ,
還有要提醒的就是上面的這三個(gè)事件都是創(chuàng)建在 Global.asax 中的,
分別對(duì)應(yīng)
Profile_MigrateAnonymous()
Profile_Personalize()
Profile_ProfileAutoSaving()
下面就來(lái)分別介紹一下
Profile_Personalize()和Profile_ProfileAutoSaving()這兩個(gè)事件
先來(lái)看 Profile_Personalize()事件吧
Personalize 事件的話,
是在 ASP.NET 獲取與當(dāng)前請(qǐng)求相關(guān)聯(lián)的當(dāng)前狀態(tài)(如會(huì)話狀態(tài))時(shí)發(fā)生,
Personalize 事件呢可以用來(lái)指定自定義的 Profile 用戶配置文件,
如果在 Personalize 事件結(jié)束時(shí),傳遞給這個(gè)事件的參數(shù) args.Profile !=null 的話,
則 ProfileModule 類將使用這個(gè) args.Profile
來(lái)作為當(dāng)前的 HttpContext 的 Profile 屬性的值,
在這里我想雖然我說(shuō)了這么多,可是估計(jì)還是有很多人不懂,
那么我就這么說(shuō)吧,直接說(shuō)下面將要介紹的 Demo 的大致內(nèi)容,
比如,一個(gè)網(wǎng)站的用戶已經(jīng)有成千上萬(wàn)了,如果,
我對(duì)單個(gè)的用戶都一一使用 Profile 進(jìn)行設(shè)置的話,
這個(gè)未免難了點(diǎn),但是您可以通過(guò)角色來(lái)管理,
比如我的網(wǎng)站假設(shè)現(xiàn)在有 Admin ,SuperAdmin , User 三個(gè)角色,
如果我要分別對(duì)屬于這三個(gè)角色中的用戶登錄時(shí),我要使用不同的 Profile ,
簡(jiǎn)單點(diǎn)的就比如我要使用不同的背景顏色吧,
當(dāng)然,您可以在每一個(gè)用戶在 aspnet_Profile 用戶表中都給他添加一個(gè)背景顏色,
然后再在每當(dāng)用戶登錄時(shí),都使用 Profile . 背景顏色 來(lái)讀取其存儲(chǔ)的顏色,
再修改頁(yè)面背景色,當(dāng)然,上面的這種方式是可以實(shí)現(xiàn)的,但是未免顯得太愚笨,
而且會(huì)造成數(shù)據(jù)庫(kù)開銷增加(
我舉的例子只是最簡(jiǎn)單的一個(gè)背景色而已,
如果內(nèi)容更多的話,那數(shù)據(jù)庫(kù)會(huì)一下子激增的)
而我再換另外一種方法來(lái)試試看,就是使用 Role 來(lái)進(jìn)行管理,
我先對(duì)所有的用戶進(jìn)行分類,然后我在每次用戶登錄時(shí)
(會(huì)發(fā)出 Request 請(qǐng)求,這個(gè)可以被 ProfileModule 捕捉到)
都先在 Profile_Personalize 事件中使用其傳遞進(jìn)來(lái)的參數(shù) ProfileEventArgs args
來(lái)得到當(dāng)前發(fā)出請(qǐng)求的 UserName ,
然后就可以根據(jù)這個(gè) UserName 來(lái)獲取其所屬的角色,
然后再在數(shù)據(jù)庫(kù)中針對(duì)其對(duì)應(yīng)的角色取出相對(duì)應(yīng)的 Profile 屬性值,
將其賦值給當(dāng)前的 Profile 對(duì)象的這個(gè)屬性
(也就是修改當(dāng)前的 Request ,修改完成后再將其交給 ASP.NET 處理),
然后再由 ProfileModule 類將這個(gè)屬性賦值給當(dāng)前的 HttpContext 的 Profile 屬性值,
這樣再在頁(yè)面上就可以直接通過(guò) Profile 來(lái)讀取這個(gè)背景顏色了,
下面就來(lái)看針對(duì)這個(gè) Profile_Personalize 事件的 Demo 吧
先看一些準(zhǔn)備工作吧,
為了簡(jiǎn)單起見呢,我是用 ASP.NET 網(wǎng)站管理工具呢又往數(shù)據(jù)庫(kù)中添加了三個(gè)用戶
分別是 SuperAdmin , Admin , Users
并且為它們?nèi)齻€(gè)創(chuàng)建了 Profile
做好了準(zhǔn)備工作了就該來(lái)創(chuàng)建 Profile_Personalize 事件了
在 Global.asax 中創(chuàng)建
<%@ Application Codebehind="Global.asax.cs"
Inherits="WebForm.Global" Language="C#" %>
<script RunAt="server">
//這里在 Global.asax 中定義的 Personalize 事件
void Profile_Personalize(object sender, ProfileEventArgs args)
{
ProfileCommon userProfile;
if (User == null)
{
return;
}
//這里我只針對(duì)通過(guò)了身份驗(yàn)證的用戶,其不包括匿名用戶
userProfile = (ProfileCommon)ProfileBase.Create(User.Identity.Name, true);
string[] userRoles = Roles.GetRolesForUser(User.Identity.Name);
if (userRoles.Length > 0)
{
if (userRoles[0] == "SuperAdmin")
{
//從 Profile 中獲取 SuperAdmins 用戶的 Profile
//作為當(dāng)前 Request 的 Profile
userProfile = userProfile.GetProfile("SuperAdmins");
}
else if (userRoles[0] == "Admin")
{
userProfile = userProfile.GetProfile("Admins");
}
else if (userRoles[0] == "User")
{
userProfile.GetProfile("Users");
}
//下面就來(lái)解釋一下為什么會(huì)有 SuperAdmins ,Admins ,Users 這幾個(gè)用戶了
//原因是我的網(wǎng)站中有三類角色,既然我要針對(duì)這三類角色進(jìn)行 Profile 的統(tǒng)一管理的話,
//那么我應(yīng)該在數(shù)據(jù)庫(kù)中保存這三類角色的 Profile ,而上面的這三個(gè)用戶
//實(shí)質(zhì)上并不是作為用戶使用的,而是作為存儲(chǔ) Profile 使用的
//就拿 SuperAdmins 來(lái)說(shuō)吧,他的 Profile 代表了所有的 SuperAdmin 的 Profile
//這樣就只需要保存一個(gè) SuperAdmins 的用戶的 Profile ,而不需要再像以前那樣
//要對(duì)每一個(gè) SuperAdmin 角色中的用戶都獨(dú)自保存同一份 Profile 了
&nb