热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » HTML/XHTML/XML编程 » 客户端访问Web Service方法的一个细节

客户端访问Web Service方法的一个细节

论坛链接
  • 客户端访问Web Service方法的一个细节
  • 发布时间:2007-10-05 20:27:40    浏览数:6781    发布者:superadmin    设置字体【   
 之前遇到一个要求,需要能够取消一个正在进行中的Web Service。这也是我第一次遇到这个功能,不过不难,我想。既然ASP.NET AJAX的客户端与服务器端通信完全通过Microsoft AJAX Library的异步通信层进行,那么我们只要得到正在请求Web Service的Sys.Net.WebRequest对象,调用其abort方法就可以了。但是究竟应该如何得到这个对象呢?于是我粗略地阅读了一下代码。

  首先假设有如下的Web Service方法定义(DemoService.asmx):

[ScriptService]
public class DemoService : System.Web.Services.WebService
{
[WebMethod]
public string DemoMethod()
{
return "Hello World";
}
}

  访问DemoService.asmx/jsdebug(或者将其使用ScriptManager引用到页面中之后)就能够得到如下的代理(片断、经过排版)类。


var DemoService = function()
{
DemoService.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succeeded = null;
this._failed = null;
}
DemoService.prototype =
{
DemoMethod:function(succeededCallback, failedCallback, userContext)
{
return this._invoke(
DemoService.get_path(),
'DemoMethod',
false,
{},
succeededCallback,
failedCallback,
userContext);
}
}
DemoService.registerClass('DemoService',Sys.Net.WebServiceProxy);
...

  显然,这个代理类继承了Sys.Net.WebServiceProxy类,于是我就把目光转向了其中的_invoke方法:


function Sys$Net$WebServiceProxy$_invoke(
servicePath, methodName, useGet, params, onSuccess, onFailure, userContext) {
// validation omitted
...
return Sys.Net.WebServiceProxy.invoke(
servicePath,
methodName,
useGet,
params,
onSuccess,
onFailure,
userContext,
this.get_timeout());
}

  这下又将操作委托给了Sys.Net.WebServiceProxy.invoke静态方法,继续看代码:


Sys.Net.WebServiceProxy.invoke = function Sys$Net$WebServiceProxy$invoke(
servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, timeout) {
// validation omitted
...
// Create a web request to make the method call
var request = new Sys.Net.WebRequest();
// preparing request omitted
...
request.invoke();
function onComplete(response, eventArgs) {
// method body omitted
}
return request;
}

  嗨,这不就是我所需要的Sys.Net.WebRequest对象吗?原来想要得到这个对象那么简单,于是我就写下了下面的代码:


var request = DemoService.DemoMethod(onComplete);

  然后在必要时:


request.abort();

  执行,出现了错误:request为undefined,为什么DemoMethod方法调用没有返回request对象?跟踪了代码之后,不大不小地晕了一下,原来问题出在这里:


DemoService._staticInstance = new DemoService();
...
DemoService.DemoMethod = function(onSuccess,onFailed,userContext)
{
DemoService._staticInstance.DemoMethod(onSuccess,onFailed,userContext);
}

  虽然早就知道Web Service代理会在类上创建一个Singleton对象,并且创建静态方法再委托给那个实例上的相应方法,却一直没有意识到这个细节。在上面的静态方法中,居然是直接调用了DemoMethod方法,却没有将结果返回出来,真让我哭笑不得了一下。

  不过问题时非常容易解决的,只要使用如下的方式在客户端调用WebService方法就可以了:


var request = DemoService._staticInstance.DemoMethod(onComplete);

  不过这个做法似乎……有些奇怪?那么您也可以这样:


var demoService = new DemoService();
var request = demoService.DemoMethod(onComplete);

  在这里,重新创建一个demoService对象似乎有些多余,不过在某些时候也是非常有用的做法。例如,您需要将操作分为两类,一类的超时时间为5秒,而另一类为10秒,因此您就可以创建两个代理对象,分别设置不同的超时时间。因为超时时间我们只能在Service的级别上设置,而不能在调用方法时指定。
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理