在内建了身份认证应用程序服务之后,ASP.NET 2.0已经提供了对用户管理的初步支持。然而,用户信息却不仅仅只是用户名和密码这两项,对于一般网站来讲,我们都需要提供一些与用户帐号相关联的自定义属性。例如在BBS程序中,这类自定义属性就有用户的积分、等级、签名档、头像等,这些自定义属性都与用户帐号一一对应。为此,ASP.NET 2.0特意内建了用户个性化应用程序服务,同样以统一的方式提供给开发者。ASP.NET 2.0内建的用户个性化应用程序服务的配置、使用非常简单,也提供了足够灵活的扩展能力。
参考:若想了解更多有关ASP.NET 2.0的用户个性化服务,请参考这篇MSDN文章:《ASP.NET Profile Properties 》(http://msdn2.microsoft.com/en-us/library/at64shx3.aspx)。
ASP.NET AJAX框架的用户个性化服务能够与ASP.NET 2.0的用户个性化应用程序服务集成起来,并为其提供客户端的JavaScript调用代理。ASP.NET AJAX客户端部分用户个性化代理的相关功能统一由客户端ProfileService对象提供。
ProfileService对象的完全限定名为Sys.Services.ProfileService。与AuthenticationService对象类似,ProfileService是一个单例(Singleton)模式的对象,无须手工创建实例即可使用。只要页面中包含有ScriptManager控件,我们即可在客户端直接访问到ProfileService对象,进而间接地与服务器端用户个性化服务打交道并使用ASP.NET 2.0提供的用户个性化服务的相关功能,例如加载或保存用户的个性化属性等——ASP.NET AJAX框架将负责整个异步通讯的实现细节,就像ASP.NET AJAX异步通讯层为Web Service生成客户端代理一样。
ProfileService对象提供了两个方法:load()和save(),分别用来加载和保存用户的个性化属性,还提供了一个名为properties的字段,用来以类似服务器端“强类型访问方式”的方法在客户端访问用户个性化属性。此外,ProfileService还暴露出了一系列的常用属性。下面我们来逐一介绍:
5.3.1 load()方法
load()方法用来加载当前用户的个性化属性,在加载完成之后,我们即可在客户端通过ProfileService对象的properties属性访问到已经被加载的各个用户个性化属性。调用load()方法的完整语法如下:
Sys.Services.ProfileService.load(
propertyNames,
loadCompletedCallback,
failedCallback,
userContext
);
其中各个参数的含义如表5-4所示。
表5-4 ProfileService对象load()方法的参数
- propertyNames:一个包含string对象的数组,表示需要从服务器端加载的用户个性化属性集合。若是该参数为null的话,则ASP.NET AJAX将自动加载所有允许客户端读取的用户个性化属性。关于如何将ASP.NET 2.0中的各个用户个性化属性有选择性地暴露给客户端,将在本章下一节的示例程序中介绍。
- loadCompletedCallback:加载用户个性化属性完成之后的回调函数。
- failedCallback:加载用户个性化属性失败时的回调函数。导致失败的原因可能是网络连接超时、或是用户个性化服务内部抛出异常等。
- userContext:随本次异步调用发送至服务器端的用户上下文对象。
表5-4中所列出的4个参数均为可选。对于loadCompletedCallback和failedCallback参数,如果为ProfileService对象设置了默认值的话(将在稍后介绍),也可以省略。
加载用户个性化属性完成之后的回调函数,即loadCompletedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onLoadCompleted(numProperties, userContext, methodName)
其中,ASP.NET AJAX在执行回调时为我们提供了3个参数:
- numProperties:表示此次加载过程中加载了的用户个性化属性的个数。
- userContext:在调用load()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
调用认证服务失败之后的回调函数,即failedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onProfileFailed(error, userContext, methodName)
ASP.NET AJAX在执行回调时同样为我们提供了3个参数:
- error:导致认证服务失败的异常对象。
- userContext:在调用load()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
5.3.2 save()方法
save()方法用来保存当前可能经过修改的用户个性化属性。调用save()方法的完整语法如下:
Sys.Services.ProfileService.save(
propertyNames,
saveCompletedCallback,
failedCallback,
userContext
);
其中各个参数的含义如表5-5所示。
表5-5 ProfileService对象logout()方法的参数
- propertyNames:一个包含string对象的数组,表示需要保存至服务器的用户个性化属性集合。若是该参数为null的话,则ASP.NET AJAX将自动保存所有允许从客户端写入的用户个性化属性。关于如何将ASP.NET 2.0中的各个用户个性化属性有选择性地暴露给客户端,将在本章下一节的示例程序中介绍。
- saveCompletedCallback:保存用户个性化属性完成之后的回调函数。
- failedCallback :保存用户个性化属性失败时的回调函数。导致失败的原因可能是网络连接超时、或是用户个性化服务内部抛出异常等。
- userContext:随本次异步调用发送至服务器端的用户上下文对象。
表5-5中所列出的4个参数均是可选的。对于saveCompletedCallback和failedCallback参数,如果为ProfileService对象设置了默认值的话(将在稍后介绍),也可以省略。
保存用户个性化属性完成之后的回调函数,即saveCompletedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onSaveCompleted(numProperties, userContext, methodName)
其中,ASP.NET AJAX在执行回调时为我们提供了3个参数:
- numProperties:表示此次保存过程中保存了的用户个性化属性的个数。
- userContext:在调用save()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
保存用户个性化属性失败时的回调函数,即failedCallback参数所指定的函数的完整的签名如下(回调函数及其参数的名称可以根据需要自行更改):
function onProfileFailed(error, userContext, methodName)
ASP.NET AJAX在执行回调时同样为我们提供了3个参数:
- error:导致认证服务失败的异常对象。
- userContext:在调用save()方法时传递的用户上下文对象。
- methodName:调用方法的方法名。
5.3.3 properties字段
ASP.NET 2.0所提供了用户个性化应用程序服务中的一个非常强大的特性就是,它允许开发者以强类型的方式访问到各个预定义的用户个性化属性。例如,若我们在web.config文件的<configuration />\<system.web />节中定义了如下的用户个性化属性:
那么在ASP.NET页面中,即可直接以强类型的方式访问到这些属性。请参考如下一段服务器端C#代码:
string address = Profile.Address;
int age = Profile.Age;
System.Drawing.Point infoPanelPosition = Profile.InfoPanelPosition;
虽然在客户端使用的JavaScript是一门动态语言,其中的变量并没有那么“严格”的类型约束,不过ProfileService对象所提供的properties字段依然能够让开发者能够以类似的语法规则在客户端访问用户个性化属性。
在调用ProfileService对象的load()方法,并成功加载了用户个性化属性之后,我们即可使用其properties字段以类似上述C#代码的方式在JavaScript中访问到各个用户个性化属性;
var address =
Sys.Services.ProfileService.properties.Address;
var age =
Sys.Services.ProfileService.properties.Age;
var infoPanelPosition =
Sys.Services.ProfileService.properties.InfoPanelPosition;
ProfileService对象的properties字段也能够支持web.config文件中定义的用户个性化组(Profile Group)。例如如下用户个性化组的定义:
在客户端JavaScript中,我们也可以使用如下的语法(即[GroupName].[PropertyName])对这个用户个性化组中的属性进行访问:
var street =
Sys.Services.ProfileService.properties.Address.Street;
var city =
Sys.Services.ProfileService.properties.Address.City;
var postCode =
Sys.Services.ProfileService.properties.Address.PostCode;
5.3.4 常用属性
除了前面介绍的load()、save()方法以及properties属性之外,ProfileService对象还提供了几个经常用到的属性,如表5-6所示。
表5-6 ProfileService对象的常用属性
- timeout:获取或设定加载/保存用户个性化属性的超时时间,单位为毫秒。
- defaultLoadCompletedCallback :获取或设定默认的加载用户个性化属性完成之后的回调函数。
- defaultSaveCompletedCallback:获取或设定默认的保存用户个性化属性完成之后的回调函数。
- defaultFailedCallback:获取或设定默认的加载/保存用户个性化属性失败时的回调函数。
如下代码演示了设置ProfileService对象的timeout属性:
Sys.Services.ProfileService.set_timeout(3000);
若是预先设定了defaultLoadCompletedCallback、defaultSaveCompletedCallback和defaultFailedCallback属性,那么在调用ProfileService对象的load()和save()方法时,即可不必重复指定各个回调函数。例如,如下代码就设定了ProfileService对象的这3个属性,并定义了相应的默认回调函数:
Sys.Services.ProfileService.set_defaultLoadCompletedCallback(onLoadCompleted);
Sys.Services.ProfileService.set_defaultSaveCompletedCallback(onSaveCompleted);
Sys.Services.ProfileService.set_defaultFailedCallback(onProfileFailed);
function onLoadCompleted(numProperties, userContext, methodName) {
// ...
}
function onSaveCompleted(numProperties, userContext, methodName) {
// ...
}
function onProfileFailed(error, userContext, methodName) {
// ...
}
随后,我们即可直接使用如下代码加载/保存用户的个性化属性了,是不是显得非常简单呢?
Sys.Services.ProfileService.load();
Sys.Services.ProfileService.save();