之前遇到一个要求,需要能够取消一个正在进行中的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的级别上设置,而不能在调用方法时指定。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
ASP.NET Web Forms的改进
虽然ASP.NET Web Forms不是vNext计划的一部分,但它并没有被忽视。作为Visual Studio 2013 Update 2的一部分,它重新开始支持新工具、EF集成和Roslyn。
-
八个超实用的jQuery技巧攻略
jQuery是JavaScript最好的库之一,主要用于制作动画、事件处理,支持Ajax及HTML脚本客户端。文中分享了8个超实用的jQuery代码技巧攻略,希望你会喜欢。
-
如何走出选择PHP还是ASP.NET的两难境地?
PHP和ASP.NET可以说是一对竞争对手,就两者的优劣性做出好坏评说的话,估计会有遭到双方程序员的激烈回应。
-
信息化考核步入中考 在线考试系统初显神威
随着信息化素质教育和考核也逐渐在各地开展起来,如何对一个地区的在校中学生进行统一的信息化操作考核一直是组织者头疼的事情。