欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程语言 > asp.net >内容正文

asp.net

asp.net ajax客户端编程之旅(二)——知其所以然 -尊龙游戏旗舰厅官网

发布时间:2024/10/8 asp.net 0 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 asp.net ajax客户端编程之旅(二)——知其所以然 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

摘要

      在上一篇文章中,做了一个“hello!asp.net ajax”的小例子,但是并没有对其中的技术做解释。这一篇中,将探讨一下使用asp.net ajax框架在客户端调用后台代码的基本方法,并且讨论异常处理的方法。

 

如何在客户端直接调用webservice中的方法?

      1.web.config中需要配置好运行asp.net ajax框架相应的配置项,当然,建立一个asp.net ajax enabled web site项目时,web.config已经配置好了。

      2.想让某个webservice可以被js调用,需要做一下几步:

            i.在这个webservice文件里用“using system.web.script.services;”引入这个命名空间。

            ii.在这个类的上面添加“[scriptservice]”属性。

            iii.在需要被调用的方法上添加“[webmethod]”属性。

            具体例子可以参考《asp.net ajax客户端编程之旅(一)——hello!asp.net ajax》中的sayhelloservice.cs的代码。

      3.调用webservice的客户端页面也要做相应准备。首先就是页面中要有一个scriptmanager控件,然后需要在其中指明webservice文件的位置。如:

            
                 
            

            将这段代码放在 />标签之间,就可以使得这个页面中的js可以直接调用sayhelloservice.asmx中的方法。具体代码可以参考《asp.net ajax客户端编程之旅(一)——hello!asp.net ajax》中第二个例子中的default.aspx的代码。

 

      做好以上三项准备,这个页面中的js代码就可以使用我们熟悉的“类名.方法名”的方法直接调用webservice中的方法了。

 

魔法背后的故事

      我们知道,虽然我们一直说是“直接调用”,但这是指在语法层面上“直接调用”。而实际上,javascript代码是不可能真正直接调用后台程序的,这中间一定使用了xmlhttprequest对象。那么,到底是谁给我们实施了“障眼法”?答案就在下面这张图上:

 

 

 

 

      上图就是这个所谓“直接调用”真正的秘密。如图,现在假设有个webservice类,名为class1,有两个方法:method1和method2。当这个webservice被我们用上面提到的方法处理过后,asp.net ajax框架就会自动分析这个类,并且在客户端生成一个这个类的客户端代理(proxy),这个代理类是一个javascript对象,其类名、方法名都和后台类一致。而当我们从客户端的js脚本调用时,实际上调用的是这个代理类,而代理类则使用xmlhttprequest对象,通过传统的ajax方式,调用后台类。这样,我们就感觉好像在前台直接调用后台类似的。

 

可是……哪里似乎还是不一样……

      通过上面的分析,我们知道,asp.net ajax调用后台方法,说到底还是使用的xmlhttprequest对象,这样传统ajax的限制,就使得我们不可能真的像在后台调用方法一样方便。

      例如,我们在后台都是用“变量=类名.方法名”或者“变量=对象名.方法名”的方式调用,这样变量就直接获取了这个方法的返回值,但是ajax不行,它必须通过回调函数获取返回值,这一点也体现在了asp.net ajax的使用方法上。看上一篇文章的例子就知道,即使使用了asp.net ajax框架,仍然还是需要用回调函数的,只不过是语法上简化了。

      下面,正式给出调用后台类的语法:

      类名.方法名(参数1,参数2,……,参数n,回调函数)

      也就是说,调用上有两个差别:一是不需要使用变量接收返回值,二是要在所有参数后面加一个参数:回调函数。例如,有个类的方法,在后台调用是:

      var1 = class1.method1(para1,para2);

      换到前台js调用时,就是如下的样子:

      class1.method1(para1,para2,callbackfunction);

      那么,返回值到哪里去取呢?答案是到回调函数中,回调函数的原型是:回调函数名(返回值)。当然,存储返回值变量的名字是开发人员随意取的,然后就可以在回调函数中使用这个返回值变量了。例如,接着上面程序,写一个函数:

      function callbackfunction(result){}

      则在这个函数中,result就含有class1.method1(para1,para2,callbackfunction);的返回值。

 

为什么不直接调用类中的方法,而非要经过webservice呢?

      上文我曾经说过,asp.net ajax允许我们直接调用后台类中的方法,但是我们不提倡这样做,而是提倡经过webservice的过渡。其原因有如下几点:

      1.要使得某个类可以被js调用,也需要在其中做一些修改,如增加一些属性(attribute)等,这会对这些类造成一种“污染”。

      2.我们知道了,使用asp.net ajax框架也需要从回调函数中获取返回值,而不是直接获取。考虑以下情况:如果某段js需要调用三个后台方法完成一个操作,那么,就需要写三个回调函数。即要经过“调用第一个方法-第一个回调函数中调用第二个方法-第二个回调函数中调用第三个方法-第三个回调函数中取得返回值”。

这个过程很麻烦。而使用webservice后,我们可以将这个三个方法封装到一个webservice方法里,因为webservice是支持“变量=类名.方法名”这种传统的调用方法的。这样经过webservice过渡,js中只要一个回调函数就可以了。

      3.从本身特性上看,webservice比普通类更适合作为ajax的后台方法。

 

处理异常

      一般来说,有成功就有失败,异步调用也是一样,会出现请求异常的情况。在传统的ajax中,不论请求成功还是失败,回调函数都会被调用,然后我们可以判断 xmlhttprequest对象的状态确定请求是否成功,如果失败了,可以进行异常处理。

      但是,在asp.net ajax应用中,只有成功时回调函数才会被调用,那么失败时怎么办?其实,asp.net ajax允许我们在调用后台方法时指定两个回调函数,语法如下:

      类名.方法名(参数1,参数2,……,参数n,请求成功时的回调函数,请求失败时的回调函数)

      只不过在前面的应用中,我们省略了第二个回调函数。为了理解这个地方,我们做一个小实验,打开上一篇中的aspnetajaxtest这个程序,将ajax.js这个文件里的内容做如下修改:

ajax.js:

 1//单击btnsayhello时调用的js函数
 2function btnsayhello_onclick()
 3{
 4    sayhelloservice.sayhello(onsucceeded,onfailded);
 5}

 6
 7//成功时的回调函数
 8function onsucceeded(reuslttext)
 9{
10    $get("result").innerhtml=reuslttext;
11}

12
13//失败时的回掉函数
14function onfailded(error)
15{
16    $get("result").innerhtml="调用失败。错误信息:"error.get_message();
17}

 

      其中异常时的回调函数有一个参数error,它是一个asp.net ajax框架定义的一个对象,包含了异常信息。其中get_message()方法将返回异常信息字符串。

      为了看效果,我们还要到webservice里搞一点破坏,让请求出现异常,“破坏”后的webservice如下:

sayhelloservice.cs:

using system;
using system.web;
using system.collections;
using system.web.services;
using system.web.services.protocols;
using system.web.script.services;

[webservice(namespace 
= "http://tempuri.org/")]
[webservicebinding(conformsto 
= wsiprofiles.basicprofile1_1)]
[scriptservice]
public class sayhelloservice : system.web.services.webservice
{
    
public sayhelloservice() { }

    [webmethod]
    
public string sayhello()
    
{
        
//hello myhello = new hello();
        
//return myhello.sayhello();
        throw new exception("我来搞破坏!");
    }

}

 

      这里我们手工抛出了一个异常。下面运行程序,会得到如下结果:

 

 

 

 

      如上图,当出现异常时,不仅自动调用了异常处理回调函数,还很方便地取得了错误信息。

 

结束语

      本篇介绍了从javascript中调用webservice的一般方法、基本原理及使用异常处理,并且回答了上一篇留下的几个问题。然而还有一个问题没有讨论:到目前为止,我们调用的后台方法都是没有参数的,那么如果有参数,asp.net ajax可以实现javascript变量类型和c#变量类型的自动转换吗?如果是复杂类型呢?如实体类、各种对象。再进一步,如果可以,应该怎么来做呢?我们将在下一篇讨论这个问题。

 

主要参考文献

      [1] 陈黎夫,asp.net ajax程序设计-第ii卷:客户端,人民邮电出版社,2007年10月

转载于:https://www.cnblogs.com/leoo2sk/archive/2008/07/23/1249367.html

总结

以上是尊龙游戏旗舰厅官网为你收集整理的asp.net ajax客户端编程之旅(二)——知其所以然的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图