使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
2007-06-08 07:44
1526 查看
本文来自《ASP.NETAJAX程序设计第II卷:客户端MicrosoftAJAXLibrary相关》的第三章《异步调用WebService和页面中的类方法》,请同时参考本章的其他文章。
3.5异步通讯层生成的客户端代理类
在前面几节中,我们已经看到了ASP.NETAJAX异步通讯层为WebService生成的客户端异步调用代理的基本使用方法。这里有必要再详细介绍一下该客户端代理的功能,并做以总结。
如下代码就是ASP.NETAJAX异步通讯层为本章第1节中那个简单的WebService所生成的客户端调用代理(代码经过格式化):
[code]SimpleWebService.initializeBase(this);
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
可以看到,ASP.NETAJAX异步通讯层为WebService生成的客户端异步调用代理类各不相同,但均继承于Sys.Net.WebServiceProxy类,以实现调用WebService,而Sys.Net.WebServiceProxy类则又在内部使用Sys.Net.WebRequest组件完成实际的HTTP请求。
调用生成的WebService客户端代理中方法的语法如下:
我们也可以先创建一个WebService客户端代理的实例,然后用该实例调用WebService的客户端代理:
[code]myGenaratedWebServiceProxy.[MethodName](param1,param2…,onSucceeded,onFailed,userContext);
[/code]
其中各个通配符以及参数的说明如表3-2所示。
表3-2WebService客户端代理调用语法中的通配符和参数
通配符/参数:描述
[NameSpace]:服务器端WebService的命名空间。若没有显式命名空间声明,则该部分可以省略
[ClassName]:服务器端WebService的类名
[MethodName]:定义在服务器端WebService中的、将要被调用的方法名
param1param2…paramn:将要调用的方法的参数列表。其中参数的个数、顺序要与WebService中方法参数的定义严格保持一致
onSucceeded:成功调用WebService之后的回调函数,该参数为可选
onFailed:调用WebService失败时的回调函数,该参数为可选
userContext:调用WebService时传递的用户上下文对象,该参数为可选
注意:对于onSucceeded、onFailed和userContext三个可选参数,若省略了位置靠前的某个参数而指定了靠后的参数,那么一定要使用null占位。例如,在发起某次调用时,我们希望跳过onFailed参数,并指定userContext,那么调用语法将类似如下所示:
ASP.NETAJAX异步通讯层为WebService生成的客户端代理组件还允许我们设置默认的onSucceeded、onFailed和userContext参数,分别通过set_defaultFailedCallback()、set_defaultFailedCallback()和set_defaultUserContext()方法完成。请参考如下代码:
[code]SomeNamespace.SomeClass.set_defaultFailedCallback(defaultFailedCallback);
[/code]
或者:
[code]theProxyInstance.set_defaultSucceededCallback(defaultSucceededCallback);
[/code]
设置了默认的回调函数以及用户上下文对象之后,若调用时省略了某一项内容,则代理组件将自动选择并使用默认的设置代替。若是调用时仍明确指定了某项内容,则该设定将覆盖默认的设定。在实际开发中,合理地使用默认的onSucceeded、onFailed和userContext参数会极大地降低程序的代码量,并让程序逻辑更加清晰。
除此之外,ASP.NETAJAX异步通讯层为WebService生成的客户端代理组件提供了超时的配置:通过其set_timeout()方法,即可设定调用过程的最长等待时间(单位为毫秒)。请参考如下代码:
或者:
[code]theProxyInstance.set_timeout(3000);
[/code]
完整的成功回调函数的签名将类似如下所示:
[code]//......
[/code]
其中result参数代表WebService的返回值;userContext参数代表用户上下文对象;methodName参数代表调用的WebService方法的名称。userContext和methodName参数均可在该回调函数中提供一些关于原始调用者的额外信息。
完整的失败回调函数的签名将类似如下所示:
[code]//......
[/code]
其中error参数是一个Sys.Net.WebServiceError对象,代表导致本次异步调用失败的异常;userContext参数代表用户上下文对象;methodName参数代表调用的WebService方法的名称。其中userContext和methodName参数均可在该回调函数中提供一些关于原始调用者的额外信息。
提示:成功回调函数和失败回调函数可以选择任何的名字,并不限于书中提到的onSucceeded()和onFailed()。
3.6使用HTTPGET进行调用
在使用ASP.NETAJAX异步通讯层对WebService进行异步调用时,默认应用的是HTTPPOST方式。但为了提供足够的灵活性,ASP.NETAJAX异步通讯层同样允许我们使用HTTPGET进行调用。
使用HTTPGET进行调用时,方法的参数均被序列化成JSON字符串,然后经过URL编码并添加至URL后面送回给服务器处理。关于GET和默认的POST方式的比较,在本卷第2章中已经有过详细介绍,这里不再重复。
若想以HTTPGET的方式对某个WebService中的方法进行调用,那么只要为该方法添加[ScriptMethod(UseHttpGet=true)]属性即可。例如对于本章第1节中的示例程序,我们可以按照如下代码修改服务器端WebService中方法的定义,注意其中粗体部分:
[code][ScriptMethod(UseHttpGet=true)]
[/code]
再次运行该示例程序,并打开HTTP嗅探器,可以看到本次异步调用确实使用了HTTPGET。如图3-9所示。
图3-9使用HTTPGET调用WebService
注意:在使用HTTPGET请求WebService时,特别要注意安全性问题。一般来讲,只有在没有暴露敏感信息且没有关键操作(例如删除/更新数据)等安全的情况下,才可以使用HTTPGET。
3.5异步通讯层生成的客户端代理类
在前面几节中,我们已经看到了ASP.NETAJAX异步通讯层为WebService生成的客户端异步调用代理的基本使用方法。这里有必要再详细介绍一下该客户端代理的功能,并做以总结。
如下代码就是ASP.NETAJAX异步通讯层为本章第1节中那个简单的WebService所生成的客户端调用代理(代码经过格式化):
varSimpleWebService=function(){
[code]SimpleWebService.initializeBase(this);
this._timeout=0;
this._userContext=null;
this._succeeded=null;
this._failed=null;
}
SimpleWebService.prototype={
SayHello:
function(name,succeededCallback,failedCallback,userContext){
returnthis._invoke(
SimpleWebService.get_path(),
'SayHello',
false,
{name:name},
succeededCallback,
failedCallback,
userContext
);
}
}
SimpleWebService.registerClass('SimpleWebService',Sys.Net.WebServiceProxy);
SimpleWebService._staticInstance=newSimpleWebService();
SimpleWebService.set_path=function(value){
vare=Function._validateParams(arguments,[{name:'path',type:String}]);
if(e)
throwe;
SimpleWebService._staticInstance._path=value;
}
SimpleWebService.get_path=function(){
returnSimpleWebService._staticInstance._path;
}
SimpleWebService.set_timeout=function(value){
vare=Function._validateParams(arguments,[{name:'timeout',type:Number}]);
if(e)
throwe;
if(value<0){
throwError.argumentOutOfRange('value',value,Sys.Res.invalidTimeout);
}
SimpleWebService._staticInstance._timeout=value;
}
SimpleWebService.get_timeout=function(){
returnSimpleWebService._staticInstance._timeout;
}
SimpleWebService.set_defaultUserContext=function(value){
SimpleWebService._staticInstance._userContext=value;
}
SimpleWebService.get_defaultUserContext=function(){
returnSimpleWebService._staticInstance._userContext;
}
SimpleWebService.set_defaultSucceededCallback=function(value){
vare=Function._validateParams(arguments,[{name:'defaultSucceededCallback',type:Function}]);
if(e)
throwe;
SimpleWebService._staticInstance._succeeded=value;
}
SimpleWebService.get_defaultSucceededCallback=function(){
returnSimpleWebService._staticInstance._succeeded;
}
SimpleWebService.set_defaultFailedCallback=function(value){
vare=Function._validateParams(arguments,[{name:'defaultFailedCallback',type:Function}]);
if(e)
throwe;
SimpleWebService._staticInstance._failed=value;
}
SimpleWebService.get_defaultFailedCallback=function(){
returnSimpleWebService._staticInstance._failed;
}
SimpleWebService.set_path("/Chapter03/Services/SimpleWebService.asmx");
SimpleWebService.SayHello=function(name,onSuccess,onFailed,userContext){
SimpleWebService._staticInstance.SayHello(name,onSuccess,onFailed,userContext);
}
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
可以看到,ASP.NETAJAX异步通讯层为WebService生成的客户端异步调用代理类各不相同,但均继承于Sys.Net.WebServiceProxy类,以实现调用WebService,而Sys.Net.WebServiceProxy类则又在内部使用Sys.Net.WebRequest组件完成实际的HTTP请求。
调用生成的WebService客户端代理中方法的语法如下:
[NameSpace].[ClassName].[MethodName](param1,param2…,onSucceeded,onFailed,userContext)
我们也可以先创建一个WebService客户端代理的实例,然后用该实例调用WebService的客户端代理:
varmyGenaratedWebServiceProxy=new[NameSpace].[ClassName]();
[code]myGenaratedWebServiceProxy.[MethodName](param1,param2…,onSucceeded,onFailed,userContext);
[/code]
其中各个通配符以及参数的说明如表3-2所示。
表3-2WebService客户端代理调用语法中的通配符和参数
通配符/参数:描述
[NameSpace]:服务器端WebService的命名空间。若没有显式命名空间声明,则该部分可以省略
[ClassName]:服务器端WebService的类名
[MethodName]:定义在服务器端WebService中的、将要被调用的方法名
param1param2…paramn:将要调用的方法的参数列表。其中参数的个数、顺序要与WebService中方法参数的定义严格保持一致
onSucceeded:成功调用WebService之后的回调函数,该参数为可选
onFailed:调用WebService失败时的回调函数,该参数为可选
userContext:调用WebService时传递的用户上下文对象,该参数为可选
注意:对于onSucceeded、onFailed和userContext三个可选参数,若省略了位置靠前的某个参数而指定了靠后的参数,那么一定要使用null占位。例如,在发起某次调用时,我们希望跳过onFailed参数,并指定userContext,那么调用语法将类似如下所示:
SomeNamespace.SomeClass.SomeMethod(param1,param2,onSucceeded,null,contextObj);
ASP.NETAJAX异步通讯层为WebService生成的客户端代理组件还允许我们设置默认的onSucceeded、onFailed和userContext参数,分别通过set_defaultFailedCallback()、set_defaultFailedCallback()和set_defaultUserContext()方法完成。请参考如下代码:
SomeNamespace.SomeClass.set_defaultSucceededCallback(defaultSucceededCallback);
[code]SomeNamespace.SomeClass.set_defaultFailedCallback(defaultFailedCallback);
SomeNamespace.SomeClass.set_defaultUserContext("defaultcontext");
[/code]
或者:
vartheProxyInstance=newSomeNamespace.SomeClass();
[code]theProxyInstance.set_defaultSucceededCallback(defaultSucceededCallback);
theProxyInstance.set_defaultFailedCallback(defaultFailedCallback);
theProxyInstance.set_defaultUserContext("defaultcontext");
[/code]
设置了默认的回调函数以及用户上下文对象之后,若调用时省略了某一项内容,则代理组件将自动选择并使用默认的设置代替。若是调用时仍明确指定了某项内容,则该设定将覆盖默认的设定。在实际开发中,合理地使用默认的onSucceeded、onFailed和userContext参数会极大地降低程序的代码量,并让程序逻辑更加清晰。
除此之外,ASP.NETAJAX异步通讯层为WebService生成的客户端代理组件提供了超时的配置:通过其set_timeout()方法,即可设定调用过程的最长等待时间(单位为毫秒)。请参考如下代码:
SomeNamespace.SomeClass.set_timeout(3000);
或者:
vartheProxyInstance=newSomeNamespace.SomeClass();
[code]theProxyInstance.set_timeout(3000);
[/code]
完整的成功回调函数的签名将类似如下所示:
functiononSucceeded(result,userContext,methodName){
[code]//......
}
[/code]
其中result参数代表WebService的返回值;userContext参数代表用户上下文对象;methodName参数代表调用的WebService方法的名称。userContext和methodName参数均可在该回调函数中提供一些关于原始调用者的额外信息。
完整的失败回调函数的签名将类似如下所示:
functiononFailed(error,userContext,methodName){
[code]//......
}
[/code]
其中error参数是一个Sys.Net.WebServiceError对象,代表导致本次异步调用失败的异常;userContext参数代表用户上下文对象;methodName参数代表调用的WebService方法的名称。其中userContext和methodName参数均可在该回调函数中提供一些关于原始调用者的额外信息。
提示:成功回调函数和失败回调函数可以选择任何的名字,并不限于书中提到的onSucceeded()和onFailed()。
3.6使用HTTPGET进行调用
在使用ASP.NETAJAX异步通讯层对WebService进行异步调用时,默认应用的是HTTPPOST方式。但为了提供足够的灵活性,ASP.NETAJAX异步通讯层同样允许我们使用HTTPGET进行调用。
使用HTTPGET进行调用时,方法的参数均被序列化成JSON字符串,然后经过URL编码并添加至URL后面送回给服务器处理。关于GET和默认的POST方式的比较,在本卷第2章中已经有过详细介绍,这里不再重复。
若想以HTTPGET的方式对某个WebService中的方法进行调用,那么只要为该方法添加[ScriptMethod(UseHttpGet=true)]属性即可。例如对于本章第1节中的示例程序,我们可以按照如下代码修改服务器端WebService中方法的定义,注意其中粗体部分:
[WebMethod]
[code][ScriptMethod(UseHttpGet=true)]
publicstringSayHelloUsingGET(stringname)
{
returnstring.Format("Hello{0}!",name);
}
[/code]
再次运行该示例程序,并打开HTTP嗅探器,可以看到本次异步调用确实使用了HTTPGET。如图3-9所示。
图3-9使用HTTPGET调用WebService
注意:在使用HTTPGET请求WebService时,特别要注意安全性问题。一般来讲,只有在没有暴露敏感信息且没有关键操作(例如删除/更新数据)等安全的情况下,才可以使用HTTPGET。
相关文章推荐
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法:服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(8):服务器端和客户端数据类型的自动转换:数组类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(5):服务器端和客户端数据类型的自动转换:基本类型和枚举类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法(转)
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(3):保持用户上下文
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法