客户端访问WebService(上)

基本使用方式

赵劼

MSDN特邀讲师

jeffz@live.com

本次课程内容包括
    • 客户端访问WebService基础
    • 客户端访问PageMethod基础
    • 错误处理
    • 复杂数据类型使用基础
    • 客户端代理使用细节

收听本次课程需具备的条件
    • 了解.NET Framework开发
    • 熟悉JavaScript开发(应知道怎么调用方法,回调函数的概念)

一、服务器端释放WebService方法
    • 编写一个普通的ASP.NET WebService
    • 为WebService类添加自定义属性标记
        – ScriptServiceAttribute
    • 释放WebService方法
        – 访问级别为public(首先基本public权限的方法)
        – 使用WebMethodAttribute进行标记
    • 为页面中的ScriptManager(Proxy)引入asmx文件

二、客户端访问WebService
    • [Namespaces.]ClassName.MethodName (命名空间 -> 类 -> 方法)
    • 依次传入参数
    • 传入一个方法做为成功后的回调函数
    • 即使没有返回值也会调用回调函数(因为它只是通知你事件已经处理完毕)

DEMO 1 (客户端访问WebService基础)

WebServiceFoundation.asmx

<%@ WebService Language="C#" Class="Sample.WebServiceFoundation" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

namespace Sample
...{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ScriptService]   //要释放时此处必须标写
    public class WebServiceFoundation : System.Web.Services.WebService //继承WebService类
    ...{
        [WebMethod]
        public int GetRandom()
        ...{
            return new Random(DateTime.Now.Millisecond).Next();
        }

        [WebMethod]
        public int GetRangeRandom(int minValue, int maxValue)
        ...{  //在一个区间获得一个随机数
            return new Random(DateTime.Now.Millisecond).Next(minValue, maxValue);
        }
    }
}

1_WebServiceFoundation.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="1_WebServiceFoundation.aspx.cs" Inherits="_1_WebServiceFoundation" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
            <Services>
                <asp:ServiceReference Path="WebServiceFoundation.asmx" InlineScript="true" /> //InlineScript 默认为false
            </Services>
        </asp:ScriptManager>
        
        <input type="button" value="Get Random" onclick="getRandom()" />
        <input type="button" value="Get Range Random" onclick="getRandom(50, 100)" />
        
        <script language="javascript" type="text/javascript">
            function getRandom(minValue, maxValue)
            ...{ //客户端提供一个类似重载的功能
                if (arguments.length != 2)
                ...{
                    Sample.WebServiceFoundation.GetRandom(getRandomSucceeded);
                }
                else
                ...{
                    Sample.WebServiceFoundation.GetRangeRandom(minValue, maxValue, getRandomSucceeded);
                }
            }
            
            function getRandomSucceeded(result)
            ...{
                alert(result);
            }
        </script>
    </form>
</body>
</html>

arguments:在JavaScript方法被调用时,都会初始化一个arguments这么一个对象,可当作一个数组类使用,但实际上是一个object,存放的就是这个方法调用时实际传入的参数

三、客户端访问PageMethod
    • 服务器端
        – 只能在aspx页面中定义
        – 只能是公开静态方法(static,无法在方法中访问页面控件)
        – 使用WebMethodAttribute标记
        – ScriptManager的EnablePageMethods属性设为true (EnablePageMethods默认为false)
    • 客户端
        – 通过PageMethods.MethodName访问

DEMO 2 (客户端访问PageMethods基础)

2_PageMethods.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="2_PageMethods.aspx.cs" Inherits="_2_PageMethods" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        
        <input type="button" value="Get Current Time" onclick="getCurrentTime()" />
    
        <script language="javascript" type="text/javascript">
            function getCurrentTime()
            ...{
                PageMethods.GetCurrentTime(getCurrentTimeSucceeded);
            }
            
            function getCurrentTimeSucceeded(result)
            ...{
                alert(result);
            }
        </script>
    </form>
</body>
</html>

2_PageMethods.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Services;

public partial class _2_PageMethods : System.Web.UI.Page
...{
    protected void Page_Load(object sender, EventArgs e)
    ...{

    }

    [WebMethod]
    public static DateTime GetCurrentTime()
    ...{
        return DateTime.UtcNow; //得到一个UTC时间
    }
}

运行结果:

当点击button时将 弹出

Mon May 14 15:11:57 UTC+0800 2007

四、错误处理
    • 调用时可以提供一个额外的错误回调函数
    • 包括超时和服务器端抛出的异常
    • 超时只能设置在WebService级别
        – 或者设置在PageMethods对象上
        – 无法在每个Method Call时指定(只能在Page中设定)
    • Sys.Net.WebServiceError (是个类)
        – timedout、message、exceptionType、stackTrace属性
只有timeout为布尔型,其他都为字符型

DEMO 3 (错误处理)

ErrorHandling.asmx

<%@ WebService Language="C#" Class="ErrorHandling" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Threading;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ErrorHandling  : System.Web.Services.WebService
...{
    [WebMethod]
    public int GetDivision(int a, int b)
    ...{
        return a / b;   //当a b为浮点数时,b为0时,不返回错误,而是返回一个无穷大的数
    }

    [WebMethod]
    public int Timeout()
    ...{
        Thread.Sleep(5000);
        return 0;
    }
}

3_ErrorHandling.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="3_ErrorHandling.aspx.cs" Inherits="_3_ErrorHandling" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            <Services>
                <asp:ServiceReference Path="ErrorHandling.asmx" />
            </Services>
        </asp:ScriptManager>
        
        <input type="button" value="getDivision" onclick="getDivision(5, 0)" />
        <input type="button" value="timeout" onclick="timeout()" />
        
        <script language="javascript" type="text/javascript">
            function getDivision(a, b)
            ...{
                ErrorHandling.GetDivision(a, b, null, failedCallback);
                                                                                     //(a b)为传入的参数,null为正确运行以后回调处理的的方法名,此处为空,表示不处理。
                                                                                    //failedCallback为出错时处理的方法名
            }
            
            function timeout()
            ...{
                ErrorHandling.set_timeout(2000); //当不设置超时时间时,将不作任何处理
                ErrorHandling.Timeout(null, failedCallback);
            }
            
            function failedCallback(error)
            ...{
                var message = String.format(
                    "Timeout: {0} Message: {1} ExceptionType: {2} StackTrace: {3}",
                    error.get_timedOut(),
                    error.get_message(),
                    error.get_exceptionType(),
                    error.get_stackTrace());
            
                alert(message);
            }
        </script>
    </form>
</body>
</html>

转载于:https://www.cnblogs.com/anyan/archive/2007/09/10/2310157.html

AJAX学习摘记——客户端访问WebService(上)相关推荐

  1. Android多媒体学习六:访问网络上的Audio对应的M3U文件,实现网络音频流的播放

    Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件. 但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来实 ...

  2. VC++6.0 用gSoap客户端访问WebService

    1.安装gSOAP 首先我们到 http://sourceforge.net/project/showfiles.php?group_id=52781链接去下载gSoap工具集,gSoap工具集不需要 ...

  3. webService学习3:客户端生成webservice代码

    1 新建项目,我准备将代码放在src目录,如下图,路径为: G:\workSpace\myeclipse\learning\webservice\01\WebServiceLearn03\src 2  ...

  4. webService学习4:客户端调用服务端的代码

    1 服务器端sayHello变化了一点,代码如下 @WebService public class HelloWSImpl implements HelloWS {public String sayH ...

  5. ajax请求返回json实例,Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据

    一.AjaxJson.aspx 处理业务数据,产生JSon数据,供JqueryRequest.aspx调用,代码如下: protected void Page_Load(object sender, ...

  6. centos ezhttp mysql_Windows 访问CentOS上Mysq配置说明

    Windows 访问CentOS上Mysq配置说明:要完成Windows上的客户端访问CentOS上的MySQL,就需要做到两点:关闭CentOS上防火墙:赋予数据库用户远程访问的权限,并清除权限的缓 ...

  7. ajax的访问 WebService 的方法

    转自原文 ajax的访问 WebService 的方法 如果想用ajax进行访问 首先在web.config里进行设置 添加在 <webServices> <protocols> ...

  8. EJB3.0学习笔记---定义客户端访问接口:

    定义客户端访问接口: 1.回顾:有状态的EJB每次都是一个新的,可以区分客户端状态,无状态的EJB可 以看成是单例的 2.客户端仅通过业务逻辑Bean所定义的接口来访问业务逻辑(跟具体实现无关) 3. ...

  9. 《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...

    第四章      TCP/IP通信案例:访问Internet上的Web服务器 HTTP协议是工作在应用层上的协议,其应用十分广泛,而在进行通信的过程中,经常使用HTTP代理服务器.HTTP代理服务器主 ...

  10. 客户端访问Web Service--参数类型的序列化与反序列化(一)

    最近开始着手学习ASP.NET AJAX,在园里看了很多关于这方面的文章,自己也曾买了关于ASP.NET AJAX的书籍,本文我将借鉴于老赵的WebCast深入浅出系列课程第五讲以记学习笔记的形式和大 ...

最新文章

  1. TFS2012 用户重复无法添加到组问题解决方法
  2. “供应链”之后,传统零售如何会战“服务链”?
  3. .NET Core开发日志——从ASP.NET Core Module到KestrelServer
  4. linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)
  5. ChoiceFormat:数字范围格式
  6. python 赚钱 知乎_爬虫实战:抓取知乎问题 “大学生如何赚到一万元”
  7. What he did
  8. Hive数据据类型 DDL DML
  9. java interface 默认_Java8 接口interface默认方法
  10. leetcode c++未初始化_LeetCode 力扣官方题解 | 538. 把二叉搜索树转换为累加树
  11. TLStorm:APC UPS 存在零点击0day,可远程烧毁设备、切断电源
  12. 十、Python-模块
  13. Js判断本地是否存在要存数据
  14. 讨论:寺庙和尚义工不宜说感谢,可以祝福
  15. 四川行无疆电商讲解拼多多电商产品销量如何清零
  16. 摄动法在计算机中的应用,摄动法及其在电力系统中的应用
  17. rovio视觉里程计的笔记
  18. 浪潮服务器管理口IPMI安装系统(浪潮服务器NF5280m5 配置,raid和系统 安装纪录)
  19. STM32——EMWIN JPEG 图片显示(二十三)
  20. 椭圆曲线算法和国密SM2算法介绍

热门文章

  1. 菜鸟学Linux 第021篇笔记 特殊权限SUID、FACL、Linux 终端
  2. 如何避免内存泄漏?(C++)
  3. [2018.10.23 T2] 行星通道计划
  4. python3生成exe文件_python3.7打包成exe就三步
  5. python shell运行_Python 执行 Shell 命令
  6. cv方向有哪些_【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
  7. php返回中文是 u,php json_encode总是返回unicode字符 u.问题 解决
  8. 飞卢服务器维护什么时候结束,2019年10月8日定期维护公告
  9. php excel parser pro v4.2,PHP Excel Parser Pro v4.2怎么用
  10. linux根据文件日期批量scp,linux系统批量传输文件(SCP)