ASP.NET 2.0 个性化用户配置

转载自 szchung
最终编辑 suizhikuo

一、数据库配置

     默认情况下,第一次执行与用户配置功能有关的应用程序时,系统将自动为该应用程序创建一个SQL Server 2005 Express的特定数据库实例,位于App_Data下的ASPNETDB.MDF。当然我们可以使用微软其它的数据库,例如SQL Server 2000,7.0。而这就需要用到aspnet_regsql命令了,该命令会在你配置的数据库中创建一个名为aspnetdb的数据库实例,并使用该数 据库存储用户配置信息。MSDN上这样描述:ASP.NET SQL Server 注册工具用于创建供 ASP.NET 中的 SQL Server 提供程序使用的 Microsoft SQL Server 数据库,或者用于在现有数据库中添加或移除选项。Aspnet_regsql.exe 文件位于 Web 服务器上的 [drive:]\WINDOWS\Microsoft.NET\Framework\versionNumber 文件夹中。aspnet_regsql有两种配置方法,一是通过命令行传递参数的形式,二是使用向导。

1)带有参数的aspnet_regsql

-总的信息和功能

  • -W 是Wizard方式,也就是图形界面的方式。
  • -C 连接字符串,-如果已经安装了SQL Server可以使用这个参数,连接数据库
  • -S 服务器名, -可以是数据库的名字或是实例的名
  • -U 用户名,-登录数据库的用户名,一般会使用这个用户建立数据库表或数据库脚本。
  • -P 密码,-登录数据库的密码。一般-U 和-P总是一起出现
  • -E , 无任何参数,这标识你将使用当前的Windows用户作为连接数据库的用户。
  • -d 数据库名, 使用这个参数制定相应的数据库名,如果没有指定则会默认使用'aspnetdb"的数据库
  • -sqlexportonly 文件名,参数为要保存的文件名,参数标识只产生数据库的脚本和配置脚本,而不进行任何的操作。
  • -A all|m|r|p|c|w ,-A 表示允许或打开某个功能,m表示membership功能,r 表示Role 管理功能,p表示Profile功能,c表示Web Parts 个性化功能,w表示 Web 事件,all表示打开/可用上面所有的全部功能
  • -R all|m|r|p|c|w -R 表示移除或禁止某个功能,m表示membership功能,r 表示Role 管理功能,p表示Profile功能,c表示Web Parts 个性化功能,w表示 Web 事件,all表示禁止/关闭上面所有的全部功能

比如: aspnet_regsql.exe –A p –E

(-A p表示在数据库中添加支持用户配置功能的数据表、储存过程等对象;-E表示使用Windows集成验证方式登录数据库。执行以上代码,将会在SQL Server2000/7。0中创建一个aspnetdb数据库实例,当然你可以用-d参数使用你已经定义好了的数据库实例,在该实例中创建了4个表,他 们是aspnet_Applications、aspnet_Profile、aspnet_SchemaVersions、aspnet_Users)

--Session State 特性

  • -ssadd ,打开/可用SQL Server 模式的Session State方式
  • -ssremove ,关闭/移除SQL Server 模式的Session State方式
  • -sstype t|p|c ,指定具体的方式,t 表示Session State的数据和状态将放在SQL Server的'tempdb"数据库中,管理脚本和存储过程会保留在“ASPState”的数据库中,如果机器启动,则Session State会不被保存,这也是默认的设置。p表示,Session State的数据和状态以及相关的存储过程都将放在SQL Server的'ASPState"数据库中;c表示,Session State的数据和状态以及相关的存储过程都将放在由-d 参数指定的SQL Server的数据库

比如:aspnet_regsql -S localhost -U sa -P wrox -ssadd -sstype p

--SQL Cache Dependency 特性

  • -ed ,没有参数表示,可用/打开SQL Cache Dependency 特性
  • -dd,没有参数,表示关闭/禁止SQL Cache Dependency 特性
  • -et,没有参数,但必须跟-t 参数,表示那个表打开/可以使用SQL Cache Dependency 特性
  • -dt, 没有参数,但必须跟-t 参数,表示禁止/关闭某个表的SQL Cache Dependency 特性
  • -t 表名,一个数据库的表名,必须和-et 或-dt一起使用
  • -lt ,没有参数,将查询数据库,列出所有使用QL Cache Dependency 特性的数据库表

比如: aspnet_regsql.exe -S localhost -U sa -P password -d Northwind -t Products –et

--------------------------

使用Visual Studio 2005创建了一个本地文件系统的网站,目录为F:\codes\Site\。并且,在App_Data目录下,新建了一个SQL Express的实例——MyDB.mdf

现在,使用aspnet_regsql工具向MyDB中注册MemberShip相关的脚本。

尝试直接启用aspnet_regsql的图形界面,没有办法访问到SQL Express的实例MyDB.mdf

但可以使用这样的命令完成此工作:

aspnet_regsql -A all -C "Data Source=.\SQLEXPRESS;Integrated Security=True;User Instance=True" -d "F:\codes\Site\App_Data\MyDB.mdf"

--------------------------

2)使用向导方式

在命令行输入aspnet_regsql,将显示一个向导窗口,一路下去,比较简单就能完成相应的配置。这些配置不仅将支持本文所要重点讨论的用户配置,而且还支持成员资格、角色管理、Web部件个性化、Web事件等在内的多个功能特征。

这里需要注意的是第三步,选择服务器和数据库。如果选的是“创建默认数据库”。那么在随后的执行过程中,将新建一个数据库实例aspnetdb.。

二、修改配置文件

      上文说过,配置文件中默认是用SQL Server 2005 Express,这里我们打算把应用服务的这些功能迁移到2000/7.0数据库中。也有两个方法,一个方法是修改machine.config,另一个方法是修改web.config.

1)修改machine.config

     默认情况下,machine.config位于[drive:]\WINDOWS\Microsoft.NET\Framework\versionNumber\config 文件夹中.下面是未修改的部分节点:

<?xml version="1.0" encoding="UTF-8"?>

<configuartion>

.....

  <connectionStrings>
<add n a m e="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
</connectionStrings>

.....

    <profile>
<providers>
<add n a m e="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>

.....

</configuration>

    上面的n a m e中间是没空格的,网易blog竟然对内容进行了过滤,无奈只好如此写了,在此表示批评和抗议,希望技术人员能够予以改进,毕竟法律赋予了我们言论自由的权利!

    注意:这里包含了一个名为LocalSqlServer的连接字符串,默认使用的数据库服务器是SQL Server2005 Express,所使用的数据库实例是aspnetdb.mdf;同时,默认使用的用户配置提供程序是 System.Web.Profile.SqlProfileProvider,其使用了LocalSqlServer连接字符串。 machine.config文件中很多配置使用了LocalSqlServer连接字符串。我们要改的重点就在LocalSqlServer上了,修改 如下:

.....

  <connectionStrings>
<add n a m e="LocalSqlServer" connectionString="Server=localhost;Database=aspnetdb;User I d=sa;Pass Word=sa providerName="System.Data.SqlClient" />
</connectionStrings>

.....

    这种方法很少使用,原因在于服务器中运行的应用程序配置大都不相同。在实际应用中,推荐使用第二种方法。

2)修改Web.config

    示例代码如下

<?xml version="1.0" encoding="UTF-8"?>

<configuartion>

.....

  <connectionStrings>
<add n a m e="SqlService" connectionString="Server=localhost;Integrated Security=SSPI;Initial Catalog=aspnetdb;" providerName="System.Data.SqlClient" />
</connectionStrings>

.....

    <profile defaultProvider="SqlProvider">
<providers>

        <clear/>
<add n a m e="SqlProvider" connectionStringName="SqlService" applicationName="Witkey" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>

.....

</configuration>

    通过connectionStrings定义了SqlService连接字符串,profile节调用了<clear/>,清除从 machine.config文件继承的相关用户配置提供的程序设置。另外,还定义了一个新的用户配置提供程序SqlProvider,作为应用程序 Witkey的默认提供程序。如果整个站点只配置了一个应用程序,applicationName="/"。

三、实现自定义用户配置提供程序

     asp.net 2.0允许用户配置属性数据存储到其他数据源中去,如Oracle,Access等,主要步骤如下:

1)创建存储用户配置数据的数据库,创建相应的数据表,一般要记录用户名称、应用程序名称、是否匿名、上次活动时间、上次更新时间、以及需要记录的页面数据等;

2)设置事件日志访问,将异常信息存储到Windows应用程序事件日志中去。这个步骤是可选的。首先在注册表下注 册:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog \Application\XxxProvider;然后就可以在下一步中采用以下代码:

private void WriteToEventLog(Exception e,string action)

{

   EventLog log = new EventLog();

   log.Source = XxxProvider;

   log.Log = "Application";

   string msg = "处理数据出错了...";

   msg + = "Action:" + action + "\n\nException:" + e.ToString();

   log.WriteEntry(msg);

}

3)实现自定义用户配置提供程序。该步骤是实现的核心。必须实现其父类的以下成员和方法:

ProviderBase类中的Initialize方法,主要实现用户配置提供程序初始化,例如调用基类方法,设置应用程序名称、设置连接字符串等;

SettingsProvider类中的ApplicationName属性、GetPropertyValues,SetPropertyValues方法,主要实现配置属性的读取,例如获取用户信息,设置属性的默认值等。

ProfileProvider类中的DeletProfiles(2个)、DeleteInactiveProfiles、 GetAllProfiles、GetAllInactiveProfiles、FindProfilesByUserName、 FindInactiveProfilesByUserName、GetNumberOfInactiveProfiles方法,主要实现用户信息的保存 和获取。

4)配置Web.config文件中的<profile>,包括所使用的用户配置提供程序、连接字符串名称、用户配置属性等。

5)应用自定义用户配置管理程序,实际上和不采用自定义数据库的代码没有区别。

     注:由上面看来,这样开发难度还是太大,不如自定义开发。推荐还是使用微软的数据库,可以省很多代码,我们使用.net追求的就是效率嘛!当然为了满足比 较bt客户的需求,你可能会遇到非要这样做不可的时刻,那么请参看<Asp.Net 2.0开发指南>一书,本文的大体内容都是从以上书中借取,结合自己的试验所作。说心里话,这书内容很全,不过感觉没有<asp.net 2.0高级编程>写得有条理。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭