一、数据库配置
默认情况下,第一次执行与用户配置功能有关的应用程序时,系统将自动为该应用程序创建一个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高级编程>写得有条理。