ASP.NET 2.0除了提供了Membership身分識別驗證機制之外,還提供了一種使用者個人化的機制,稱為Profile。Profile可以和Membership結合起來,儲存使用者自訂資料。在Profile中可以儲存各種類型的資料,包括最基本的int、double類型,也可以是複雜的使用者自訂類型,比如購物車、使用者資訊等。
Profile和Session類似,都是用來儲存使用者自訂資料,但是二者也有本質的區別:
1.Session只能夠短暫的保留使用者資料(預設為20分鐘),但是Profile可以持久的儲存,因為二者的儲存介質不同,Session預設是存放在記憶體當中的,而Profile是存放在資料庫中。雖然說Session可以通過配置使之儲存在狀態伺服器或者資料庫當中,但還是有很大的區別。
2.Profile是強型別的,而Session僅僅是一個項集合而已。並且VS對Profile提供了智能感知的支援,使用方便。
下面來看看如何使用Profile,首先第一步和Membership一樣,也是添加資料庫支援,還是和Membership一樣,如果之前按照前面說的添加過了,在這裡直接開始第二步,就是配置。若沒有,則參考前面的文章添加資料庫支援。將下面代碼複製入web.config的system.web節點之下:
<profile enabled="true" defaultProvider="SqlProvider">
<providers>
<add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ConnectionString" applicationName="TestMembership"/>
</providers>
<properties>
<add name="test" type="String" allowAnonymous="true"/>
</properties>
</profile>
這個配置大多數的屬性和Membership中的含義是一樣的,我們只是說明一下特有的屬性。在這個配置當中有Providers和Properties節點,其中Providers節點之前在配置Membership中瞭解過了,現在介紹一下properties節點:
在這個節點下,add標籤的作用就是添加一個“屬性”,name屬性就是“屬性”的名字,type就是“屬性”的類型,這個類型可以是int、double等單一資料型別,也可以是購物車類等使用者自訂資料類型,不過需要注意的是,如果為“類”類型,則該類必須可以序列化,就是在類的上面添加[Serializable]特性。allowAnonymous這個屬性指定使用者在匿名狀態下,是否可以設定該屬性。
好了,配置完畢,我們就可以在頁面上使用Profile了,建立一個頁面,在頁面上添加一個button雙擊在button的click事件當中寫下如下代碼:
Profile.test = "123123";
這個Profile.test就是我們在前面properties節點下添加的“屬性”,類型為string類型。
瀏覽這個頁面,點擊button,看下效果,哈!出錯了!錯誤提示如下:
設定檔屬性“test”允許匿名使用者儲存資料。這要求啟用 AnonymousIdentification 功能。
這是因為ASP.NET預設情況下不允許匿名使用者,很簡單,我們簡單的設定一下,允許使用匿名使用者即可,還是在web.config中system.web節點下添加一段配置:
<anonymousIdentification enabled="true"/>
ok,現在再來瀏覽下頁面,點擊button試試?沒有任何反應?這就對了!
我們再次建立一個頁面,在這個頁面的page_load事件當中添加一句Response.write(Profile.test);
完事,我們先瀏覽第一個頁面,點擊button,執行了Profile.test=“123123”;這段代碼,然後關閉瀏覽器,再開啟第二個頁面,可以看到,我們在第一個頁面中存入的“123123”這個字串,在第二個頁面顯示出來了。
原理很簡單:當我們開啟了anonymousIdentification功能後,ASP.NET會給每個使用者指派一個AnonymousID,儲存在Cookie中。
這是Cookie中儲存的內容,.ASPXANONYMOUS這是預設的Cookie名稱,可以在web.config中的anonymousIdentification節中CookieName屬性中設定自己的Cookie名字。
這是在調試狀態下,得到的AnonymousID
這是資料庫aspnet_Users表中儲存的內容,注意UserName和IsAnonymous欄位。
這是資料庫中aspnet_Profile中的內容,可以看到,我們test屬性中的內容為:123123,PropertyNames欄位中test:S:0:6的含義大家應該猜出來了吧!test是屬性名稱,S代表的String類型,0:6代表PropertyValuesString欄位中的從第0位到第6位的內容。
這樣,當該使用者使用這台電腦再次訪問網站,網站便可以根據這個Cookie中的AnonymousID來識別出使用者的身份,再通過AnonymousID從aspnet_Profile表中,便可以取出使用者上一次儲存的資料。
ok,以上便是匿名狀態下的Profile。當然,如果我們不需要匿名,而要求使用者登入後才能儲存資料的話,那麼就沒上面這麼麻煩了,直接設定allowAnonymous="false"即可,不需要去添加anonymousIdentification 配置。這樣,該屬性只能在使用者登入狀態下訪問,未登入去訪問該屬性就會報錯。
本篇文章簡單的介紹了下Profile在實際項目中的應用,大家可以照著試一下,先有一個感性認識,下篇繼續,會有一個小的項目,來完整的示範一下Profile的應用。