您的位置:首页 > 理论基础 > 计算机网络

使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用

2012-01-16 04:56 1331 查看
======================================================

注:本文源代码点此下载

======================================================

本文来自《asp.net ajax程序设计 第ii卷:客户端microsoft ajax library相关》的第三章《异步调用web service和页面中的类方法》,请同时参考本章的其他文章
3.5 异步通讯层生成的客户端代理类
在前面几节中,我们已经看到了asp.net ajax异步通讯层为web service生成的客户端异步调用代理的基本使用方法。这里有必要再详细介绍一下该客户端代理的功能,并做以总结。
如下代码就是asp.net ajax异步通讯层为本章第1节中那个简单的web service所生成的客户端调用代理(代码经过格式化):
var simplewebservice = function() {
simplewebservice.initializebase(this);
this._timeout = 0;
this._usercontext = null;
this._succeeded = null;
this._failed = null;
}
simplewebservice.prototype = {
sayhello:
function(name,succeededcallback, failedcallback, usercontext) {
return this._invoke(
simplewebservice.get_path(),
'sayhello',
false,
{name:name},
succeededcallback,
failedcallback,
usercontext
);
}
}
simplewebservice.registerclass('simplewebservice',sys.net.webserviceproxy);
simplewebservice._staticinstance = new simplewebservice();
simplewebservice.set_path = function(value) {
var e = function._validateparams(arguments, [{name: 'path', type: string}]);
if (e)
throw e;
simplewebservice._staticinstance._path = value;
}
simplewebservice.get_path = function() {
return simplewebservice._staticinstance._path;
}
simplewebservice.set_timeout = function(value) {
var e = function._validateparams(arguments, [{name: 'timeout', type: number}]);
if (e)
throw e;
if (value
throw error.argumentoutofrange('value', value, sys.res.invalidtimeout);
}
simplewebservice._staticinstance._timeout = value;
}
simplewebservice.get_timeout = function() {
return simplewebservice._staticinstance._timeout;
}
simplewebservice.set_defaultusercontext = function(value) {
simplewebservice._staticinstance._usercontext = value;
}
simplewebservice.get_defaultusercontext = function() {
return simplewebservice._staticinstance._usercontext;
}
simplewebservice.set_defaultsucceededcallback = function(value) {
var e = function._validateparams(arguments, [{name: 'defaultsucceededcallback', type: function}]);
if (e)
throw e;
simplewebservice._staticinstance._succeeded = value;
}
simplewebservice.get_defaultsucceededcallback = function() {
return simplewebservice._staticinstance._succeeded;
}
simplewebservice.set_defaultfailedcallback = function(value) {
var e = function._validateparams(arguments, [{name: 'defaultfailedcallback', type: function}]);
if (e)
throw e;
simplewebservice._staticinstance._failed = value;
}
simplewebservice.get_defaultfailedcallback = function() {
return simplewebservice._staticinstance._failed;
}
simplewebservice.set_path("/chapter03/services/simplewebservice.asmx");
simplewebservice.sayhello= function(name,onsuccess,onfailed,usercontext) {
simplewebservice._staticinstance.sayhello(name,onsuccess,onfailed,usercontext);
}
可以看到,asp.net ajax异步通讯层为web service生成的客户端异步调用代理类各不相同,但均继承于sys.net.webserviceproxy类,以实现调用web service,而sys.net.webserviceproxy类则又在内部使用sys.net.webrequest组件完成实际的http请求。
调用生成的web service客户端代理中方法的语法如下:
[namespace].[classname].[methodname](param1, param2 …, onsucceeded, onfailed, usercontext)
我们也可以先创建一个web service客户端代理的实例,然后用该实例调用web service的客户端代理:
var mygenaratedwebserviceproxy = new [namespace].[classname]();
mygenaratedwebserviceproxy.[methodname](param1, param2 …, onsucceeded, onfailed, usercontext);
其中各个通配符以及参数的说明如表3-2所示。
表3-2 web service客户端代理调用语法中的通配符和参数
通配符/参数:描述
[namespace]:服务器端web service的命名空间。若没有显式命名空间声明,则该部分可以省略
[classname]:服务器端web service的类名
[methodname]:定义在服务器端web service中的、将要被调用的方法名
param1 param2 … param n:将要调用的方法的参数列表。其中参数的个数、顺序要与web service中方法参数的定义严格保持一致
onsucceeded:成功调用web service之后的回调函数,该参数为可选
onfailed:调用web service失败时的回调函数,该参数为可选
usercontext:调用web service时传递的用户上下文对象,该参数为可选
注意:对于onsucceeded、onfailed和usercontext三个可选参数,若省略了位置靠前的某个参数而指定了靠后的参数,那么一定要使用null占位。例如,在发起某次调用时,我们希望跳过onfailed参数,并指定usercontext,那么调用语法将类似如下所示:
somenamespace.someclass.somemethod(param1, param2, onsucceeded, null, contextobj);
asp.net ajax异步通讯层为web service生成的客户端代理组件还允许我们设置默认的onsucceeded、onfailed和usercontext参数,分别通过set_defaultfailedcallback()、set_defaultfailedcallback()和set_defaultusercontext()方法完成。请参考如下代码:
somenamespace.someclass.set_defaultsucceededcallback(defaultsucceededcallback);
somenamespace.someclass.set_defaultfailedcallback(defaultfailedcallback);
somenamespace.someclass.set_defaultusercontext("default context");
或者:
var theproxyinstance = new somenamespace.someclass();
theproxyinstance.set_defaultsucceededcallback(defaultsucceededcallback);
theproxyinstance.set_defaultfailedcallback(defaultfailedcallback);
theproxyinstance.set_defaultusercontext("default context");
设置了默认的回调函数以及用户上下文对象之后,若调用时省略了某一项内容,则代理组件将自动选择并使用默认的设置代替。若是调用时仍明确指定了某项内容,则该设定将覆盖默认的设定。在实际开发中,合理地使用默认的onsucceeded、onfailed和usercontext参数会极大地降低程序的代码量,并让程序逻辑更加清晰。
除此之外,asp.net ajax异步通讯层为web service生成的客户端代理组件提供了超时的配置:通过其set_timeout()方法,即可设定调用过程的最长等待时间(单位为毫秒)。请参考如下代码:
somenamespace.someclass.set_timeout(3000);
或者:
var theproxyinstance = new somenamespace.someclass();
theproxyinstance.set_timeout(3000);
完整的成功回调函数的签名将类似如下所示:
function onsucceeded(result, usercontext, methodname) {
// ......
}
其中result参数代表web service的返回值;usercontext参数代表用户上下文对象;methodname参数代表调用的web service方法的名称。usercontext和methodname参数均可在该回调函数中提供一些关于原始调用者的额外信息。
完整的失败回调函数的签名将类似如下所示:
function onfailed(error, usercontext, methodname){
// ......
}
其中error参数是一个sys.net.webserviceerror对象,代表导致本次异步调用失败的异常;usercontext参数代表用户上下文对象;methodname参数代表调用的web service方法的名称。其中usercontext和methodname参数均可在该回调函数中提供一些关于原始调用者的额外信息。
提示:成功回调函数和失败回调函数可以选择任何的名字,并不限于书中提到的onsucceeded()和onfailed()。
3.6 使用http get进行调用
在使用asp.net ajax异步通讯层对web service进行异步调用时,默认应用的是http post方式。但为了提供足够的灵活性,asp.net ajax异步通讯层同样允许我们使用http get进行调用。
使用http get进行调用时,方法的参数均被序列化成json字符串,然后经过url编码并添加至url后面送回给服务器处理。关于get和默认的post方式的比较,在本卷第2章中已经有过详细介绍,这里不再重复。
若想以http get的方式对某个web service中的方法进行调用,那么只要为该方法添加[scriptmethod(usehttpget = true)]属性即可。例如对于本章第1节中的示例程序,我们可以按照如下代码修改服务器端web service中方法的定义,注意其中粗体部分:
[webmethod]
[scriptmethod(usehttpget = true)]
public string sayhellousingget(string name)
{
return string.format("hello {0}!", name);
}
再次运行该示例程序,并打开http嗅探器,可以看到本次异步调用确实使用了http get。如图3-9所示。



图3-9使用http get调用web service
注意:在使用http get请求web service时,特别要注意安全性问题。一般来讲,只有在没有暴露敏感信息且没有关键操作(例如删除/更新数据)等安全的情况下,才可以使用http get。

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐