ASP.NET Profile

关键

  1、配置<system.web>元素下的<profile>元素;如果需要支持匿名的话则还需要配置<system.web>元素下的<anonymousIdentification>元素。示例如下,仅为说明:

<profile enabled="true" defaultProvider="SqlProfileProvider" inherits="CustomProfile">
   <providers>
    <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
       connectionStringName="SqlConnectionString"
       applicationName="/" />
   </providers>
   <properties>
    <add name="Name" />
    <add name="Color" type="System.Drawing.Color" />
    <group name="Group">
     <add name="Collection" type="System.Collections.ArrayList" />
     <add name="Price" type="int" defaultValue="100" />
    </group>
   </properties>
  </profile>
  
  <anonymousIdentification
   enabled="true"
   cookieName=".VS2005_ANONYMOUS"
   cookieTimeout="1440"
   cookiePath="/"
   cookieRequireSSL="false"
   cookieSlidingExpiration="true"
   cookieProtection="All"
   cookieless="UseCookies" />

<profile>元素的inherits属性指定自定义类,该类要继承自ProfileBase

Profile是自动保存的,但是某些复杂类型可能无法自动保存,此时需要设置<profile>元素的automaticSaveEnabled设置为false,要保存的话则调用 Profile 上的 Save 方法即可。要动态取消Profile的自动保存功能的话则需要在 global.asax 中加一个Profile_ProfileAutoSaving事件,示例如下,仅为说明

void Profile_ProfileAutoSaving(Object sender, ProfileAutoSaveEventArgs e)
  {
    if ((e.Context.Items["CancelProfileAutoSave"] != null) && ((bool)e.Context.Items["CancelProfileAutoSave"] == true))
      e.ContinueWithProfileAutoSave = false;
  }

在需要取消Profile的自动保存功能的页的代码处如下写

protected void Page_Load(object sender, EventArgs e)
{
 Context.Items["CancelProfileAutoSave"] = true;  
}

2、通过ProfileManager执行相关任务,如搜索有关所有配置文件、经过身份验证用户的配置文件及匿名用户的配置文件的统计信息,确定在给定时间段内尚未修改的配置文件的数量,根据配置文件的上一次修改日期删除单个配置文件及多个配置文件等

3、将匿名配置文件迁移到经过身份验证的配置文件

在global.asax加一个Profile_MigrateAnonymous事件处理

void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs pe)
  {
   // 获得匿名配置
   ProfileCommon anonProfile = Profile.GetProfile(pe.AnonymousID);
  
   // 从匿名配置中取值并赋值给经过身份验证的配置
   if (anonProfile.Color != System.Drawing.Color.Empty)
   {
    Profile.Color = anonProfile.Color;
   }
    
   // 从数据库中删除匿名配置
   ProfileManager.DeleteProfile(pe.AnonymousID);
    
   // 清除与某个会话关联的匿名 Cookie 或标识符
   AnonymousIdentificationModule.ClearAnonymousIdentifier(); 
  }

示例

  App_Code/CustomProfile.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
  
using System.Web.Profile;
  
/**//// <summary>
/// CustomProfile 的摘要说明
/// </summary>
public class CustomProfile : ProfileBase
{
  private string _customName;
  public string CustomName
  {
    get { return (string)base["CustomName"]; }
    set { base["CustomName"] = value; }
  }
  
  private bool _customSex;
  public bool CustomSex
  {
    get { return (bool)base["CustomSex"]; }
    set { base["CustomSex"] = value; }
  }
}

web.config

<profile enabled="true" defaultProvider="SqlProfileProvider" inherits="CustomProfile">
   <providers>
    <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
       connectionStringName="SqlConnectionString"
       applicationName="/" />
   </providers>
   <properties>
    <add name="Name" />
    <add name="Color" type="System.Drawing.Color" />
    <group name="Group">
     <add name="Collection" type="System.Collections.ArrayList" />
     <add name="Price" type="int" defaultValue="100" />
    </group>
   </properties>
  </profile>
Profile/Test.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs"
  Inherits="Profile_Test" Title="存储用户配置测试" %>
  
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
  <asp:Label ID="lbl" runat="Server" />
</asp:Content>

Profile/Test.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
  
public partial class Profile_Test : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    // 一看就懂
    Profile.Name = User.Identity.Name;
    Profile.Color = System.Drawing.Color.AliceBlue;
    Profile.Group.Collection.Clear();
    Profile.Group.Collection.Add("冰棍");
    Profile.Group.Collection.Add("瓜子");
    Profile.Group.Price = 999999;
  
    Profile.CustomName = User.Identity.Name;
    Profile.CustomSex = true;
  
    lbl.Text = "Name:" + Profile.Name + "<br />";
    lbl.Text += "Color:" + Profile.Color.ToString() + "<br />";
    foreach (string s in Profile.Group.Collection)
    {
      lbl.Text += "商品有:" + s + "<br />";
    }
    lbl.Text += "价格:" + Profile.Group.Price + "<br />";
  
    lbl.Text += "自定义类名字:" + Profile.CustomName + "<br />";
    lbl.Text += "自定义类姓名:" + Profile.CustomSex;
  }
}

用“abc”这个用户登录后的运行结果

  Name:abc

  Color:Color [AliceBlue]

  商品有:冰棍

  商品有:瓜子

  价格:999999

  自定义类名字:abc

  自定义类姓名:True

  注:需要用aspnet_regsql配置数据库

  OK

posted on 2010-06-07 21:11  henzy  阅读(141)  评论(0编辑  收藏  举报

导航