您现在的位置是:首页 >

客户端错误访问被拒 客户端访问Web Service方法的一个细节

火烧 2022-07-30 12:43:20 1055
客户端访问We Service方法的一个细节   之前遇到一个要求 需要能够取消一个正在进行中的We Service 这也是我第一次遇到这个功能 不过不难 我想 既然ASP NET AJAX的客户端与

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

  之前遇到一个要求 需要能够取消一个正在进行中的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 = ; 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对象?跟踪了代码之后 不大不小地晕了一下 原来问题出在这里

客户端错误访问被拒 客户端访问Web Service方法的一个细节

  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);

lishixinzhi/Article/program/net/201311/11513  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码