本文包括了 ASP.NET 档案提供者的一个范例代码。这个范例提供者使用 .NET Framework 的 ODBC 数据提供者来连接到一个 ODBC 数据源。另外,这个范例还使用了一个 Access 数据库来作为它的数据源。
本文还描述了关于档案提供者范例的实现细节并且描述了如何建立范例并且配置 ASP.NET 应用程序来使用这个范例提供者。
提示:因为数据源支持不同的 SQL 语法,所以一些 SQL 命令将只能在一种数据源中运行,而其他的就不行。因此,我们建议你针对你的数据源来创建档案提供者,即使如果你使用的是 .NET Framework 的 ODBC 数据提供者或者 .NET Framework 的 OLEDB 数据提供者来访问你的数据源。例如,你可能会创建一个单独的提供者(比如 SybaseProfileProvider、OracleProfileProvider,等等)。
如果要查看范例提供者的代码,就请参考:[实现档案提供者的范例]。
创建提供者数据库
提供者被设计用来从三个数据表中读取并且写入数据:Profiles、StockSymbols,以及 ProfileData。另外,范例档案提供者还支持两个档案属性:一个储蓄符号列表与一个 ZIP(邮政)编码。
每个用户档案都唯一地被标志在数据库的 Profiles 数据表中。档案信息(比如应用程序名称与最后的活跃日期)也都被包含在这个数据库中。Profiles 数据表中还包括了一个自动增量的主键,用来唯一地识别每个数据行并且把这个数据表关联到包含档案属性值的数据库的其他数据表。
StockSymbols 数据表包含了使用 StockSymbols 属性而被存储并且被获取的储蓄符号列表值。另外,StockSymbols 数据表与 Profiles 数据表之间存在着一对多的关系,这是因为一个单独的用户档案能够留下任意数量的储蓄符号。
ZipCode 属性的值被存储在 ProfileData 数据表中。并且 ProfileData 数据表与 Profiles 数据表之间还存在着一对一的关系。
创建用来存储档案的数据表
- 创建一个新的 Microsoft Access 数据库或者打开现有的一个。
提示:如果你把数据库存储在 Web 应用程序的文件目录中,那么我们建议你把数据库存储到应用程序的 App_Data 目录中。App_Data 目录中的内容对于应用程序代码是可用的,但是不会被直接暴露给 Web 请求。另外,ASP.NET 进程还拥有对 App_Data 目录进行读取并且写入的许可。
- 在 Access 或者其他你能够用来为 Access 数据库创建数据表的工具中,发布下列数据定义查询来创建 Profiles 数据表:
CREATE TABLE Profiles ( UniqueID AutoIncrement NOT NULL PRIMARY KEY, Username Text (255) NOT NULL, ApplicationName Text (255) NOT NULL, IsAnonymous YesNo, LastActivityDate DateTime, LastUpdatedDate DateTime, CONSTRAINT PKProfiles UNIQUE (Username, ApplicationName) )
- 发布下列数据定义查询来创建 StockSymbols 数据表:
CREATE TABLE StockSymbols ( UniqueID Integer, StockSymbol Text (10), CONSTRAINT FKProfiles1 FOREIGN KEY (UniqueID) REFERENCES Profiles )
- 发布下列数据定义查询来创建 ProfileData 数据表:
CREATE TABLE ProfileData ( UniqueID Integer, ZipCode Text (10), CONSTRAINT FKProfiles2 FOREIGN KEY (UniqueID) REFERENCES Profiles )
提供事件日志访问
如果范例提供者在操作数据源的时候遇到了一个异常,那么提供者就会把详细的异常内容写入到 Windows Application 事件日志中来替代把异常返回到 ASP.NET 应用程序的做法。这应该作为一种安全标准来保护在 ASP.NET 应用程序中被暴露并且与数据源有关的私有信息。
范例提供者还指定了一个名为 "OdbcProfileProvider" 的事件 Source。在你的 ASP.NET 应用程序将能够被成功地写入到 Application 事件日志之前,你将需要创建对于事件日志的访问。
提示:如果你不需要范例提供者把异常写入到事件日志中,那么你可以在 Web.config 文件中把提供者配置中的 writeExceptionsToEventLog 特性设置成 false。
提供对于事件日志的访问
- 使用 Regedit.exe 或者其他的 Windows 注册表编辑工具来创建下列注册表主键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\OdbcProfileProvider
建立范例提供者
为了使用范例提供者,你必须确保代码对于你的 Web 应用程序来说是可用的。你有两种方式来完成这个任务:
- 把范例提供者的源代码存放到应用程序的 App_Code 目录中。在这种情况下,你不需要手动对范例代码进行编译。
- 编译代码并且把结果汇编集存放到应用程序的 Bin 目录中,或者对它强命名然后存放到全局汇编集缓存中。
在无需手动编译的情况下测试范例提供者
- 如果你的应用程序没有完成上述任何任务,那么你就应该在应用程序的根目录创建一个名为 App_Code 的目录。
- 在 App_Code 目录中,创建一个名为 OdbcProfileProvider.vb 或者 OdbcProfileProvider.cs 的文本文件,这取决于你所使用的编程语言。
提示:如果你的应用程序的 App_Code 目录中已经存在源代码,那么就需要使用与该目录中现有代码相同编程语言来编写范例提供者。ASP.NET 将在 ASP.NET 应用程序中的页面第一次被请求的时候对提供者进行编译。
- 把范例的源代码(使用适当的编程语言所编写)复制并且粘贴成相应的文本文件并且保存。
编译范例提供者
- 为资源文件、自定义控件与相关的类创建目录。
- 在源代码目录中,创建一个被命名为 OdbcProfileProvider.vb 或者 OdbcProfileProvider.cs 的文本文件,这取决于你所使用的编程语言。
提示:不要把源代码存放到 App_Code 目录中,如果你同样准备手动编译范例并且把它的汇编集添加到 Bin 目录中的话。如果你这样做,那么提供者的类型将会在已编译的汇编集以及 App_Code 目录中通过 ASP.NET 而动态生成并创建的汇编集中同时存在。这将在装载提供者的时候创建不明确的引用并且对类型进行引用的任何代码都将产生一个编译器错误。
- 复制每个范例的源代码并且把它粘贴成相应的文本文件然后保存。
- 从源代码目录中运行下列命令把控件与相关的类编译到汇编集中。
csc /out:OdbcProfileProvider.dll /t:library OdbcProfileProvider.cs /r:System.Web.dll /r:System.Configuration.dll
编译器选项 /t:library 会告诉编译器:创建一个库(胜于一个可执行的汇编集)。/out 选项为汇编集提供了一个名称,而 /r 选项则会列出被链接到你的汇编集的其他汇编集。
提示:如果你不能执行编译器命令,那么你就必须在运行这个命令之前把 .NET Framework 安装路径添加到 PATH 变量中。在 Windows 中,右键单击 My Computer,单击 Properties,单击 Advanced 制表页,然后单击 Environment Variables 按钮。在 System 变量列表中双击 Path 变量。在 Variable 值的文本框中的现有值的未尾部分添加一个分号(;),然后输入你的 .NET Framework 安装路径。.NET Framework 通常被安装在 Windows 安装目录的 "\Microsoft.NET\Framework\版本号" 子目录中。
在 ASP.NET 应用程序中配置范例提供者
要在 ASP.NET Web 应用程序中使用范例提供者,你就必须配置应用程序来注册这个提供者。
范例配置假设你的网站被设置成使用窗体识别并且包括一个名为 Login.aspx 的 ASP.NET 页面来允许用户登入并且建立用户标识。范例配置同样支持匿名识别,因此用户的登入不是必需的。
配置一个应用程序来使用范例提供者
- 创建一个名为 Login.aspx 的 ASP.NET 页面然后完成下列任务:
- 为它添加一个 Login 控件,如果应用程序已经被配置成使用 ASP.NET 成员资格。
- 创建一个登入窗体并且使用窗体识别来识别用户。关于详细内容,请参考:[实践:实现简单的窗体识别]。
提示:窗体验证中所必需的配置元素在第 4 步中已经被说明。
- 在你的计算机中创建一个名为 "OdbcProfile" 的 DSN 并且配置它来包括先前被创建的 Access 数据库的连接信息。
- 在应用程序的根目录创建一个名为 Web.config 的文本文件,如果它在你的 ASP.NET 应用程序中并不存在的话。
- 在 Web.config 文件中,添加下列元素:
<configuration> <connectionStrings> <add name="OdbcProfile" connectionString="DSN=OdbcProfile;" /> </connectionStrings> <system.web> <authentication mode="Forms" > <forms loginUrl="login.aspx" name=".ASPXFORMSAUTH" /> </authentication> <anonymousIdentification enabled="true" /> <profile defaultProvider="OdbcProvider"> <providers> <add name="OdbcProvider" type="Samples.AspNet.Profile.OdbcProfileProvider" connectionStringName="OdbcProfile" /> </providers> <properties> <add name="ZipCode" allowAnonymous="true" /> <add name="CityAndState" provider="AspNetSqlProfileProvider" allowAnonymous="true" /> <add name="StockSymbols" type="System.Collections.ArrayList" allowAnonymous="true" /> </properties> </profile> </system.web> </configuration>