转载出自:http://www.cnblogs.com/xlb2000/archive/2010/08/06/1791903.html

  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节点之下:

ASP.NET用户个性化设置Profile——配置1_个性化设置
<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>
ASP.NET用户个性化设置Profile——配置1_个性化设置

 

  这个配置大多数的属性和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中。如图:

ASP.NET用户个性化设置Profile——配置1_Profile_03

  这是Cookie中存储的内容,.ASPXANONYMOUS这是默认的Cookie名称,可以在web.config中的anonymousIdentification节中CookieName属性中设置自己的Cookie名字。

ASP.NET用户个性化设置Profile——配置1_个性化设置_04

  这是在调试状态下,得到的AnonymousID

ASP.NET用户个性化设置Profile——配置1_ASP.NET_05

  这是数据库aspnet_Users表中存储的内容,注意UserName和IsAnonymous字段。

ASP.NET用户个性化设置Profile——配置1_Profile_06

  这是数据库中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的应用。