关于Debug和Release之本质区别的讨论
发布时间:2020-12-17 02:44:49 所属栏目:安全 来源:网络整理
导读:导读: 之前遇到一个要求,需要能够取消一个正在进行中的Web Service。这也是我第一次遇到这个功能,不过不难,我想。既然ASP.NET AJAX的客户端与服务器端通信完全通过Microsoft AJAX Library的异步通信层进行,那么我们只要得到正在请求Web Service的Sys.Ne
导读:
之前遇到一个要求,需要能够取消一个正在进行中的Web Service。这也是我第一次遇到这个功能,不过不难,我想。既然ASP.NET AJAX的客户端与服务器端通信完全通过Microsoft AJAX Library的异步通信层进行,那么我们只要得到正在请求Web Service的Sys.Net.WebRequest对象,调用其abort方法就可以了。但是究竟应该如何得到这个对象呢?于是我粗略地阅读了一下代码。 www@bitscn@com 首先假设有如下的Web Service方法定义(DemoService.asmx): www@bitscn@com [ScriptService] publicclassDemoService : System.Web.Services.WebService { [WebMethod] publicstringDemoMethod() { return"Hello World"; } } [bitsCN.Com] bbs.bitsCN.com中国网管论坛 访问DemoService.asmx/jsdebug(或者将其使用ScriptManager引用到页面中之后)就能够得到如下的代理(片断、经过排版)类。 bbs.bitsCN.com中国网管论坛 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) { returnthis._invoke( DemoService.get_path(), 'DemoMethod', false, {}, succeededCallback, failedCallback, userContext); } } DemoService.registerClass('DemoService',Sys.Net.WebServiceProxy); ... bitsCN~com www@bitscn@com 显然,这个代理类继承了Sys.Net.WebServiceProxy类,于是我就把目光转向了其中的_invoke方法: DL@bitsCN_com网管软件下载 functionSys$Net$WebServiceProxy$_invoke( servicePath,methodName,useGet,params,onSuccess,onFailure,userContext) { // validation omitted ... returnSys.Net.WebServiceProxy.invoke( servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, this.get_timeout()); } BBS.bitsCN.com网管论坛 www_bitscn_com中国.网管联盟 这下又将操作委托给了Sys.Net.WebServiceProxy.invoke静态方法,继续看代码: www_bitscn_com中国.网管联盟 Sys.Net.WebServiceProxy.invoke = function Sys$Net$WebServiceProxy$invoke( servicePath,userContext,timeout) { // validation omitted ... // Create a web request to make the method call var request = newSys.Net.WebRequest(); // preparing request omitted ... request.invoke(); function onComplete(response,eventArgs) { // method body omitted } returnrequest; } www_bitscn_com中国.网管联盟 bbs.bitsCN.com 嗨,这不就是我所需要的Sys.Net.WebRequest对象吗?原来想要得到这个对象那么简单,于是我就写下了下面的代码: bbs.bitsCN.com中国网管论坛 varrequest = DemoService.DemoMethod(onComplete); 中国_网管联盟bitsCN.com [bitsCN.Com] 然后在必要时: BBS.bitsCN.com网管论坛 request.abort(); 中国_网管联盟bitsCN.com bitsCN#com中国网管联盟 执行,出现了错误:request为undefined,为什么DemoMethod方法调用没有返回request对象?跟踪了代码之后,不大不小地晕了一下,原来问题出在这里: [bitsCN.Com] DemoService._staticInstance = newDemoService(); ... DemoService.DemoMethod = function(onSuccess,onFailed,userContext) { DemoService._staticInstance.DemoMethod(onSuccess,userContext); } bitsCN~com bbs.bitsCN.com 虽然早就知道Web Service代理会在类上创建一个Singleton对象,并且创建静态方法再委托给那个实例上的相应方法,却一直没有意识到这个细节。在上面的静态方法中,居然是直接调用了DemoMethod方法,却没有将结果返回出来,真让我哭笑不得了一下。 www@bitscn@com 不过问题时非常容易解决的,只要使用如下的方式在客户端调用WebService方法就可以了: [bitsCN_com] varrequest = DemoService._staticInstance.DemoMethod(onComplete); bitsCN.nET*中国网管博客 bbs.bitsCN.com中国网管论坛 不过这个做法似乎……有些奇怪?那么您也可以这样: BBS.bitsCN.com网管论坛 var demoService = newDemoService(); var request = demoService.DemoMethod(onComplete); www@bitscn@com www@bitscn@com 在这里,重新创建一个demoService对象似乎有些多余,不过在某些时候也是非常有用的做法。例如,您需要将操作分为两类,一类的超时时间为5秒,而另一类为10秒,因此您就可以创建两个代理对象,分别设置不同的超时时间。因为超时时间我们只能在Service的级别上设置,而不能在调用方法时指定。 DL@bitsCN_com网管软件下载 本文转自 http://www.bitscn.com/dotnet/xml/200709/109617.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |