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

简介:
[索引页]
[源码下载]


新瓶旧酒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
<%@ WebService Language= "C#" Class= "AuthenticationService" %> 
 
using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Web.Script.Services; 
 
[WebService(Namespace =  "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class AuthenticationService : System.Web.Services.WebService 

        /// <summary> 
        /// 登录 
        /// </summary> 
        /// <param name="userName">用户名</param> 
        /// <param name="password">密码</param> 
        /// <param name="createPersistentCookie">是否跨浏览器保存认证信息(持久保留)</param> 
        /// <returns></returns> 
        [WebMethod] 
        public bool Login(string userName, string password, bool createPersistentCookie) 
        { 
                //Place code here. 
 
                System.Web.Security.FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
                return true
        } 
 
        /// <summary> 
        /// 注销 
        /// </summary> 
        [WebMethod] 
        public void Logout() 
        { 
                //Place code here. 
        } 
}
 
ProfileService.asmx
<%@ WebService Language= "C#" Class= "ProfileService" %> 
 
using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Web.Script.Services; 
using System.Collections.Generic; 
 
[WebService(Namespace =  "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class ProfileService : System.Web.Services.WebService 

        /// <summary> 
        /// 获取用户的全部Profile 
        /// </summary> 
        /// <returns></returns> 
        [WebMethod] 
        public IDictionary<stringobject> GetAllPropertiesForCurrentUser() 
        { 
                Dictionary<stringobject> dic = new Dictionary<stringobject>(); 
 
                dic.Add("Age", 27); 
                dic.Add("Salary", 100); 
 
                Article article = new Article(); 
                article.Title = "Article Title From Server"
                article.PublishTime = DateTime.Now; 
 
                dic.Add("Article", article); 
 
                return dic; 
        } 
 
        /// <summary> 
        /// 获取用户的指定的Profile 
        /// </summary> 
        /// <param name="properties">属性名称数组</param> 
        /// <returns></returns> 
        [WebMethod] 
        public IDictionary<stringobject> GetPropertiesForCurrentUser(string[] properties) 
        { 
                //Place code here. 
                return null
        } 
 
        /// <summary> 
        /// 保存用户的Profile 
        /// </summary> 
        /// <param name="values">用户的Profile的字典数据</param> 
        /// <returns></returns> 
        [WebMethod] 
        public int SetPropertiesForCurrentUser(IDictionary<stringobject> values) 
        { 
                //Place code here. 
                return values.Count; 
        } 

 
/// <summary> 
/// Article实体类 
/// </summary> 
/// <remarks> 
/// 示例而已,实际项目中要继承自System.Web.Profile.ProfileBase 
/// </remarks> 

public class Article 

        private string _title; 
        /// <summary> 
        /// 文章标题 
        /// </summary> 
        public string Title 
        { 
                get { return _title; } 
                set { _title = value; } 
        } 
 
        private DateTime _publishTime; 
        /// <summary> 
        /// 文章发布日期 
        /// </summary> 
        public DateTime PublishTime 
        { 
                get { return _publishTime; } 
                set { _publishTime = value; } 
        } 
}
 
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
[源码下载]



     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/344814 ,如需转载请自行联系原作者


相关文章
|
5月前
|
存储 JSON 开发工具
Visual Studio编程效率提升技巧集(提高.NET编程效率)
Visual Studio编程效率提升技巧集(提高.NET编程效率)
Visual Studio编程效率提升技巧集(提高.NET编程效率)
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
41 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
传感器 数据采集 物联网
探索.NET nanoFramework:为嵌入式设备编程的新途径
探索.NET nanoFramework:为嵌入式设备编程的新途
63 7
|
7月前
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
63 1
|
4月前
|
大数据 开发工具 开发者
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
44 1
|
4月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
142 7
|
4月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
50 0
|
4月前
|
传感器 数据采集 物联网
探索未来:.NET nanoFramework引领嵌入式设备编程革新之旅
【8月更文挑战第28天】.NET nanoFramework 是一款专为资源受限的嵌入式设备设计的轻量级、高性能框架,基于 .NET Core,采用 C# 进行开发,简化了传统底层硬件操作的复杂性,极大提升了开发效率。开发者可通过 Visual Studio 或 Visual Studio Code 快速搭建环境并创建项目,利用丰富的库和驱动程序轻松实现从基础 LED 控制到网络通信等多种功能,显著降低了嵌入式开发的门槛。
90 0
|
7月前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
86 1
|
7月前
|
Go 开发者
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
87 1