[索引页]
[×××]


新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)


作者:webabcd


介绍
ASP.NET AJAX的Sys.Services.AuthenticationService类、Sys.Services.ProfileService类、Sys.Services.ProfileGroup类完美地和ASP.NET 2.0的Membership和Profile进行了集成


关键
1、Sys.Services.AuthenticationService类的login()方法
    Sys.Services.AuthenticationService.login(userName, password, isPersistent, customInfo, redirectUrl, loginCompletedCallback, failedCallback, userContext);
    ·userName - 用户名
    ·password - 密码
    ·isPersistent - 是否跨浏览器保存认证信息(持久保留)
    ·customInfo - 保留字段,可能在将来使用
    ·redirectUrl - 登录成功后重定向到的URL
    ·loginCompletedCallback - 登录成功后的回调函数
    ·failedCallback - 登录失败后的回调函数
    ·userContext - 用户上下文
    WebService中与其对应的方法 - public bool Login()

2、登录成功后的回调函数
    function LoginComplete(bool validCredentials, userContext, methodName)
    ·validCredentials - 是否成功通过了验证
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

3、Sys.Services.AuthenticationService类的logout()方法
    Sys.Services.AuthenticationService.logout(redirectUrl, logoutCompletedCallback, failedCallback, userContext);
    ·redirectUrl - 注销成功后重定向到的URL
    ·logoutCompletedCallback - 注销成功后的回调函数
    ·failedCallback - 注销失败后的回调函数
    ·userContext - 用户上下文
    WebService中与其对应的方法 - public void Logout()

4、注销成功后的回调函数
    function LogoutComplete(result, userContext, methodName)
    ·result - 保留字段,可能在将来使用,始终为null
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

5、Sys.Services.AuthenticationService类的属性
    ·defaultLoginCompletedCallback - 登录成功后的回调函数
    ·defaultLogoutCompletedCallback - 注销成功后的回调函数
    ·defaultFailedCallback - 登录或注销失败后的回调函数
    ·isLoggedIn - 当前用户是否已经登录
    ·path - authentication service路径
    ·timeout - 超时时间

6、Sys.Services.ProfileService类的load()方法
    Sys.Services.ProfileService.load(propertyNames, loadCompletedCallback, failedCallback, userContext);
    ·propertyNames - Profile属性名称数组
    ·loadCompletedCallback - 成功后的回调函数
    ·failedCallback - 失败后的回调函数
    ·userContext - 用户上下文
    WebService中与其对应的方法 - public IDictionary<string, object> GetAllPropertiesForCurrentUser()和public IDictionary<string, object> GetPropertiesForCurrentUser(string[] properties)

7、读取Profile成功后的回调函数
    function onLoadCompleted(numProperties, userContext, methodName)
    ·numProperties - 返回的Profile属性个数
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

8、Sys.Services.ProfileService类的save()方法
    Sys.Services.ProfileService.load(propertyNames, saveCompletedCallback, failedCallback, userContext);
    ·propertyNames - Profile属性名称数组
    ·saveCompletedCallback - 成功后的回调函数
    ·failedCallback - 失败后的回调函数
    ·userContext - 用户上下文
    ·WebService中与其对应的方法 - public int SetPropertiesForCurrentUser(IDictionary<string, object> values)

9、保存Profile成功后的回调函数
    onSaveCompleted(numProperties, userContext, methodName)
    ·numProperties - 保存的Profile属性个数
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

10、Sys.Services.ProfileService类的属性
    ·读取或设置某个Profile的属性要这么写 - Sys.Services.ProfileService.properties.FieldName; 
    ·defaultLoadCompletedCallback - 读取Profile成功后的回调函数
    ·defaultSaveCompletedCallback - 保存Profile成功后的回调函数
    ·defaultFailedCallback - 读取或保存Profile失败后的回调函数
    ·path - profile service路径
    ·timeout - 超时时间

11、Sys.Services.ProfileGroup类
    ·定义一个Profile组(同时需要在Web.config中定义)

12、登录或注销失败、读取或保存Profile失败后的回调函数
    function onFailed(error, userContext, methodName)
    ·error - Sys.Net.WebServiceError对象
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

13、如果要自动调用相关服务的话,则需要在web.config中的<configuration />节点下增加类似如下的配置
<webServices>
        <authenticationService enabled="true" requireSSL="false"/>
        <profileService enabled="true"    
                readAccessProperties="Age, Salary"
                writeAccessProperties="Age, Salary"    
        />
</webServices>
 
示例
AuthenticationService.asmx
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX<%@ WebService Language="C#" Class="AuthenticationService" %>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Services;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Services.Protocols;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Script.Services;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[WebService(Namespace = "http://tempuri.org/")]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[ScriptService]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXpublic class AuthenticationService : System.Web.Services.WebService
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX{
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 登录
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <param name="userName">用户名</param>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <param name="password">密码</param>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <param name="createPersistentCookie">是否跨浏览器保存认证信息(持久保留)</param>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <returns></returns>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        [WebMethod]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public bool Login(string userName, string password, bool createPersistentCookie)
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                //Place code here.
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                System.Web.Security.FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                return true;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 注销
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        [WebMethod]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public void Logout()
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                //Place code here.
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX}
 
ProfileService.asmx
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX<%@ WebService Language="C#" Class="ProfileService" %>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Services;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Services.Protocols;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Web.Script.Services;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXusing System.Collections.Generic;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[WebService(Namespace = "http://tempuri.org/")]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX[ScriptService]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXpublic class ProfileService : System.Web.Services.WebService
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX{
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 获取用户的全部Profile
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <returns></returns>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        [WebMethod]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public IDictionary<string, object> GetAllPropertiesForCurrentUser()
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                Dictionary<string, object> dic = new Dictionary<string, object>();
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                dic.Add("Age", 27);
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                dic.Add("Salary", 100);
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                Article article = new Article();
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                article.Title = "Article Title From Server";
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                article.PublishTime = DateTime.Now;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                dic.Add("Article", article);
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                return dic;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 获取用户的指定的Profile
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <param name="properties">属性名称数组</param>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <returns></returns>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        [WebMethod]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public IDictionary<string, object> GetPropertiesForCurrentUser(string[] properties)
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                //Place code here.
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                return null;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 保存用户的Profile
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <param name="values">用户的Profile的字典数据</param>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <returns></returns>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        [WebMethod]
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public int SetPropertiesForCurrentUser(IDictionary<string, object> values)
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                //Place code here.
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                return values.Count;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX}
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
/// <summary>
/// Article实体类
/// </summary>
/// <remarks>
/// 示例而已,实际项目中要继承自System.Web.Profile.ProfileBase
/// </remarks>

新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAXpublic class Article
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX{
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        private string _title;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 文章标题
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public string Title
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                get { return _title; }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                set { _title = value; }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        private DateTime _publishTime;
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// <summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// 文章发布日期
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        /// </summary>
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        public DateTime PublishTime
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        {
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                get { return _publishTime; }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX                set { _publishTime = value; }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX        }
新瓶旧酒ASP.NET AJAX(10) - 客户端脚本编程(Sys.Services命名空间下的类)_AJAX}
 
Sample.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Sample.aspx.cs"
        Inherits="ClientScripting_SysServices_Sample" Title="Sys.Services命名空间下的类" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        <div>
                帐号:<input type="text" id="txtUserId" /></div>
        <div>
                密码:<input type="password" id="txtPassword" /></div>
        <div>
                 </div>
        <div>
                <input type="button" id="btnLogin" value="登录" />
                <input type="button" id="btnLogout" value="注销" /></div>
        <div>
                 </div>
        <div>
                年龄:<input type="text" id="txtAge" /></div>
        <div>
                薪水:<input type="text" id="txtSalary" /></div>
        <div>
                <input type="button" id="btnSave" value="保存Profile" />
                <input type="button" id="btnLoad" value="读取Profile" />
        </div>
        <div>
                 </div>
        <div id="result" />

        <script type="text/javascript">
                var userId;
                var password;
                var login;
                var logout;
                var age;
                var salary

                function pageLoad()
                {
                        userId = $get("txtUserId");
                        password = $get("txtPassword");
                        login = $get("btnLogin");
                        logout = $get("btnLogout");
                        age = $get("txtAge");
                        salary = $get("txtSalary");
                        
                        // path - authentication service路径
                        $get("result").innerHTML = "AuthenticationService path:" + Sys.Services.AuthenticationService.get_path() + "<br />";
                        // timeout - 超时时间
                        $get("result").innerHTML += "AuthenticationService timeout:" + Sys.Services.AuthenticationService.get_timeout() + "<br />";
                        // path - profile service路径
                        $get("result").innerHTML += "ProfileService path:" + Sys.Services.ProfileService.get_path() + "<br />";
                        // timeout - 超时时间
                        $get("result").innerHTML += "ProfileService timeout:" + Sys.Services.ProfileService.get_timeout() + "<br />";
                }                
                                
                function btnLogin_click()
                {
                        // defaultLoginCompletedCallback - 登录成功后的回调函数
                        Sys.Services.AuthenticationService.set_defaultLoginCompletedCallback(onLoginCompleted);
                        // defaultFailedCallback - 登录或注销失败后的回调函数
                        Sys.Services.AuthenticationService.set_defaultFailedCallback(onFailed);
                        
                        Sys.Services.AuthenticationService.login
                        (
                                userId.value, // 用户名
                                password.value, // 密码
                                false, // 是否跨浏览器保存认证信息(持久保留)
                                null, // 保留字段,可能在将来使用
                                null, // 登录成功后重定向到的URL
                                null, // 登录成功后的回调函数
                                null, // 登录失败后的回调函数
                                "用户上下文" // 用户上下文
                        );
                }
                
                function btnLogout_click()
                {
                        // defaultLogoutCompletedCallback - 注销成功后的回调函数
                        Sys.Services.AuthenticationService.set_defaultLogoutCompletedCallback(onLogoutCompleted);
                        // defaultFailedCallback - 登录或注销失败后的回调函数
                        Sys.Services.AuthenticationService.set_defaultFailedCallback(onFailed);

                        Sys.Services.AuthenticationService.logout
                        (
                                null, // 注销成功后重定向到的URL
                                null, // 注销成功后的回调函数
                                null, // 注销失败后的回调函数
                                null // 用户上下文
                        );
                }
                
                function onLoginCompleted(validCredentials, userContext, methodName)
                {
                        password.value = "";
                        
                        // validCredentials - 是否成功通过了验证
                        // userContext - 用户上下文
                        // methodName - 调用的方法名
                        if (validCredentials)    
                        {
                                userId.value = "";
                                
                                $get("result").innerHTML = "登录成功" + "<br />";
                                $get("result").innerHTML += "用户上下文:" + userContext + "<br />";
                                $get("result").innerHTML += "调用的方法名为:" + methodName + "<br />";
                        }
                        else
                        {
                                $get("result").innerHTML = "登录失败" + "<br />";
                        }
                        
                        // isLoggedIn - 当前用户是否已经登录
                        var status = Sys.Services.AuthenticationService.get_isLoggedIn();
                        $get("result").innerHTML += "登录状态:" + status + "<br />";
                }
                
                function onFailed(error, userContext, methodName)
                {        
                        // error - Sys.Net.WebServiceError对象
                        // userContext - 用户上下文
                        // methodName - 调用的方法名
                        $get("result").innerHTML += "错误信息:" + error.get_message() + "<br />";
                }
                
                function onLogoutCompleted(result, userContext, methodName)    
                {
                        // result - 保留字段,可能在将来使用,始终为null
                        // userContext - 用户上下文
                        // methodName - 调用的方法名
                        alert("成功调用" + methodName) + "<br />";
                }
                
                
                function btnLoad_click()
                {
                        // defaultLoadCompletedCallback - 读取Profile成功后的回调函数
                        Sys.Services.ProfileService.set_defaultLoadCompletedCallback(onLoadCompleted);
                        // defaultFailedCallback - 读取或保存Profile失败后的回调函数
                        Sys.Services.ProfileService.set_defaultFailedCallback(onFailed);
                        
                        Sys.Services.ProfileService.load
                        (
                                null, // Profile属性名称数组
                                null, // 成功后的回调函数
                                null, // 失败后的回调函数
                                null // 用户上下文
                        );
                }
                
                function btnSave_click()
                {
                        // defaultSaveCompletedCallback - 保存Profile成功后的回调函数
                        Sys.Services.ProfileService.set_defaultSaveCompletedCallback(onSaveCompleted);
                        // defaultFailedCallback - 读取或保存Profile失败后的回调函数
                        Sys.Services.ProfileService.set_defaultFailedCallback(onFailed);
                        
                        Sys.Services.ProfileService.properties.Age = age.value;
                        Sys.Services.ProfileService.properties.Salary = salary.value;
                        
                        // 定义一个Profile组(同时需要在Web.config中定义)
                        Sys.Services.ProfileService.properties.Article = new Sys.Services.ProfileGroup();
                        Sys.Services.ProfileService.properties.Article.Title = "Article Title";
                        Sys.Services.ProfileService.properties.Article.PublishTime = new Date();

                        Sys.Services.ProfileService.save
                        (
                                null, // Profile属性名称数组
                                null, // 成功后的回调函数
                                null, // 失败后的回调函数
                                null // 用户上下文
                        );
                }
                
                function onLoadCompleted(numProperties, userContext, methodName)
                {
                        // numProperties - 返回的Profile属性个数
                        // userContext - 用户上下文
                        // methodName - 调用的方法名
                        $get("result").innerHTML = "通过Profile读取的属性的数量为:" + numProperties.toString() + "<br />";
                        $get("result").innerHTML += "Age:" + Sys.Services.ProfileService.properties.Age + "<br />";
                        $get("result").innerHTML += "Article Title:" + Sys.Services.ProfileService.properties.Article.Title + "<br />";        
                        $get("result").innerHTML += "Article PublishTime:" + Sys.Services.ProfileService.properties.Article.PublishTime.format("yyyy-MM-dd") + "<br />";
                }

                function onSaveCompleted(numProperties, userContext, methodName)
                {
                        // numProperties - 保存的Profile属性个数
                        // userContext - 用户上下文
                        // methodName - 调用的方法名
                        $get("result").innerHTML = "通过Profile保存的属性的数量为:" + numProperties.toString() + "<br />";
                }
        </script>

</asp:Content>
 
ScriptManager的设置
<asp:ScriptManager ID="ScriptManager1" runat="server">
                        <AuthenticationService Path="~/ClientScripting/SysServices/AuthenticationService.asmx" />
                        <ProfileService Path="~/ClientScripting/SysServices/ProfileService.asmx" />
                </asp:ScriptManager>
 
Web.config中的相关设置(在<system.web />节点下)
<profile enabled="true">
            <properties>
                <group name="Article">
                    <add name="Title" type="System.String" />
                    <add name="PublishTime" type="System.DateTime" />
                </group>
            </properties>
        </profile>
 
 
运行结果
1、页面加载后
AuthenticationService path:/Web/ClientScripting/SysServices/AuthenticationService.asmx
AuthenticationService timeout:0
ProfileService path:ProfileService.asmx
ProfileService timeout:0

2、单击“登录”按钮
登录成功
用户上下文:用户上下文
调用的方法名为:Sys.Services.AuthenticationService.login
登录状态:true

3、单击“注销”按钮
弹出框,信息:成功调用Sys.Services.AuthenticationService.logout

4、单击“保存Profile”按钮
通过Profile保存的属性的数量为:4

5、单击“读取Profile”按钮
通过Profile读取的属性的数量为:3
Age:27
Article Title:Article Title From Server
Article PublishTime:2007-07-12


OK
[×××]