异步调用webservice

     今天学习webservice的异步调用。找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作。

  但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法。这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文。

  一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的。

     文中讲了两种异步调用的方法。一种是用后台线程直接调用webservice。webservice本身没有什么不同,就是最直接的调用。异步主要是通过后台线程(BackgroundWorker,仅WinForm中调用)实现。

  文中代码引用如下:

 1  private void button1_Click(object sender, EventArgs e)  
 2  {  
 3      BackgroundWorker backgroundworker = new BackgroundWorker();  
 4      //注册具体异步处理的方法  
 5      backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);  
 6      //注册调用完成后的回调方法  
 7      backgroundworker.RunWorkerCompleted +=   
 8          new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);  
 9      //这里开始异步调用  
10      backgroundworker.RunWorkerAsync();  
11      //调用服务的同时客户端处理并不停止  
12      ChangeProcessBar();   
13  }  
14  //完成事件  
15  void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  
16  {  
17      if (e.Error != null)  
18          throw e.Error;  
19      progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满  
20      string price = e.Result.ToString();   //获取处理结果  
21      MessageBox.Show("调用完成。价格是:" + price); //显示从服务器获取的结果值  
22  }  
23  //调用方法  
24  void back_DoWork(object sender, DoWorkEventArgs e)  
25  {  
26      //Web Service代理类  
27      ProductService.LTPService service = new ProductService.LTPService();  
28      //调用Web方法GetClass1,将结果赋值给DoWorkEventArgs的Result对象  
29      e.Result = service.GetProductPrice("001");   
30  } 

 

进度条显示函数:

 1 //<summary>  
 2 //界面的进度条显示  
 3 //</summary>  
 4 void ChangeProcessBar()  
 5 {  
 6     for (int i = 0; i < 10; i++)  
 7     {  
 8         progressBar1.Value = i;  
 9         System.Threading.Thread.Sleep(500);  
10     }  
11 } 

 

 

  第二种异步调用的方法是调用webservice内置的异步调用方式。这里主要就要调用<WebService方法名>Async方法来实现异步的。

  原文代码引用如下:

 1 private void button2_Click(object sender, EventArgs e)  
 2 {  
 3     //Web Service代理类  
 4     ProductService.LTPService service = new ProductService.LTPService();  
 5     //这里开始异步调用  
 6     service.GetProductPriceAsync("001");   
 7     //注册调用完成后的回调方法  
 8     service.GetProductPriceCompleted += new ProductService.  
 9         GetProductPriceCompletedEventHandler(GetProductPriceCompleted);  
10     //调用同时客户端处理不停止    
11     ChangeProcessBar();  
12 }  
13 //完成事件处理方法  
14 void GetProductPriceCompleted(object sender, ProductService.  
15             GetProductPriceCompletedEventArgs e)  
16 {  
17     if (e.Error != null)  
18         throw e.Error;  
19     progressBar1.Value = progressBar1.Maximum;  //调用完成了,把客户端进度条填充满  
20     string price = e.Result.ToString();         //获取处理结果  
21     MessageBox.Show("调用完成。价格是:" + price);   //显示从服务器获取的结果值  
22 } 

 

 

      另外一篇博文是冯东的,其中正好对上面讲到的内容作了些补充和总结,以及在Ajax方面做了些扩展叙述。

  其中有一点,就是在Web页面的属性中添加Async="true",以使页面可以调用webservice内置的异步功能。

  Web Method代码引用如下:

1    [WebMethod]
2    public DLL.EmployeesDataTable getEmployee()
3    {
4       DLL.EmployeesDataTable result = new DLL.EmployeesDataTable();
5       DLLTableAdapters.EmployeesTableAdapter eta = new WebServiceAsyn.DLLTableAdapters.EmployeesTableAdapter();
6       eta.FillEmployee(result);
7       return result;
8    }

 

  客户端调用代码引用如下:

 1 /实体化WebService引用
 2 private AsynWebService.Service1 asynSer;
 3 //构造函数初始化 WebService引用,并为异步调用WebService设置好了结果处理函数【方法名Completed】(先这么叫吧,我也不知道怎么叫)
 4 public _Default()
 5 {
 6     asynSer = new AsynWebService.Service1();
 7     asynSer.HelloWorldCompleted += new AsynWebService.HelloWorldCompletedEventHandler(asynSer_HelloWorldCompleted);
 8     asynSer.getEmployeeCompleted += new AsynWebService.getEmployeeCompletedEventHandler(asynSer_getEmployeeCompleted);
 9 }
10 protected void Button1_Click(object sender, EventArgs e)
11 {
12     //开始异步调用HelloWorld;
13     asynSer.HelloWorldAsync();
14 }
15 
16 protected void asynSer_HelloWorldCompleted(object sender, AsynWebService.HelloWorldCompletedEventArgs e)
17 {
18     this.Label1.Text = e.Result.ToString();
19 }
20 
21 protected void asynSer_getEmployeeCompleted(object sender, AsynWebService.getEmployeeCompletedEventArgs e)
22 {
23     this.GridView1.DataSource = e.Result;
24     this.GridView1.DataBind();
25 }
26 protected void Button2_Click(object sender, EventArgs e)
27 {
28     //开始异步调用getEmployee
29     asynSer.getEmployeeAsync();
30 }

 

 

   下面是作者给出的Ajax的异步调用和作者对这两种异步调用方式的总结:

 1 <script language="javascript" type="text/javascript">
 2     var xmlHttp;
 3     function createXMLHttpRequest()
 4     {
 5     if(window.ActiveXObject)
 6     {
 7        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 8     }
 9     else if(window.XMLHttpRequest)
10     {
11        xmlHttp = new XMLHttpRequest();
12     }        
13    }
14     
15     function requestStart()
16     {
17         if(document.getElementById("tbx1").value.length <= 4)
18         {
19             alert("用户名的长度要求大于4个字符!");
20             return false;
21         }
22         document.getElementById("sp1").innerText = "Loding";
23         var url = "default.aspx?userName=" + document.getElementById("tbx1").value;
24     createXMLHttpRequest();//创建XMLHttpRequest对象
25     xmlHttp.onreadystatechange = callBack;//为XMLHttpRequest对象指定结果处理函数
26     xmlHttp.open("GET",url);//打开链接
27     xmlHttp.send(null);//发送请求
28     }
29     //结果处理函数                
30     function callBack()
31     {
32     if(xmlHttp.readyState == 4)
33     {
34        document.getElementById("sp1").innerText = xmlHttp.responseText;
35     }
36     }        
37 </script>

 

  作者给出的总结

  1:Ajax需要创建XMLHttpRequest对象,Asp.Net需要实体化WebService代理类对象
2:XMLHttpRequest 对象需要指定结果处理函数,Asp.Net也需要指定结果处理函数
3:XMLHttpRequest的结果处理函数必须在请求发送之前设置,Asp.Net同样也是需要在              方法被调用之前设置好结果处理函数

      作者还提到了一些Flex中的异步调用webservice的知识,用兴趣的同学可以到作者的原文中查看。

 

 

引用博文:

http://book.51cto.com/art/200906/129768.htm

http://www.cnblogs.com/interboy/archive/2007/04/06/702594.html

     

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2010/04/30/1724595.html

时间: 2024-07-28 14:51:13

异步调用webservice的相关文章

WebService大讲堂之Axis2(8):异步调用WebService

上一篇:WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService 在前面几篇文章中都是使用同步方式来调用WebService.也就是说,如果被调用的WebService方法长 时间不返回,客户端将一直被阻塞,直到该方法返回为止.使用同步方法来调用WebService虽然很直观, 但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这 样用户是无法忍受的. 当然,我们很容易就可以想到解决问题的方法,

关于在weblogic中异步调用webservice

这几天碰到个问题:在weblogic中调用async webservice,如果客户端不等待结果(比如服务器端因为某些原因,web service需要执行很长时间),直接退出的话,weblogic server是否保存调用结果,结果保存多长时间?如果这样的异常客户端很多,对服务器有什么负面影响,比如连接资源.内存开销等. 首先我们先阐述一下异步的概念 在weblogic webservice中,有两处异步的概念: 1:Synchronous request-response (the defau

C/S结构客户端异步调用WebService

问题描述 C/S结构客户端(有多个客户端)调用服务端,请求后直接可以返回结果,但是该结果不是最终结果.后续服务端还会生成若干个状态信息.客户端如何才能拿到这些信息.想到几种解决方法,但都不完美.1.客户端通过异步WebService方式调用,拿到结果后,如果不是最终状态,再发起一个异步调用(缺点:占用连接)2.客户端轮询(缺点:占用资源)3.用户手动触发(缺点:用户体验不好) 解决方案 轮询的方案是最简单的,并且不容易出错,服务器可以返回客户端一个标记,然后客户端再拿这个标记去服务器询问是否有了

异步调用webservice返回responseXML为空的问题解决方法_实用技巧

先总结几个要领: 1)要熟悉javascript对XML文件的加载与操作: DOM的XML操作可参考的示例:http://www.w3school.com.cn/xmldom/met_document_getelementsbytagname.asp 2)在IE下面还是要通过loadXML来转responseText: 3)xml加载后异步属性设置: 4)命名空间处理等问题: 下面上代码: ========ASPX前台代码======== 复制代码 代码如下: <%@ Page Language

客户端调用WebService,服务端有时候接收不到消息的问题!!

问题描述 web应用,客户端和服务端均是C#,服务端只有一个调用方法,且在服务端接收消息时均有记录日志.现在的情况是,网络正常的情况下,客户端调用服务端时,传输相同的数据内容调用,50次里面可能有一两次调用会报TimeOut的错误,且这一两次TimeOut时服务端均没有接收到消息的日志记录.出现这种情况后,刷新一下页面,再次调用就又能成功了.弄了很久都没搞明白问题出在哪里,哪位大虾碰到过这种情况?? 解决方案 解决方案二:网络问题,你把WEBSERVICE设置成异步看看解决方案三:应该不会是网络

关于webservice的异步调用实例

web|异步 关于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明.这是一个webservice     _    Public Function delCurTable(ByVal tbName As String) As Boolean        Try            Return True        Catch ex As Exc

关于webservice的异步调用简单实例

web|异步 关于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明.这是一个webservice <WebMethod(Description:="试验")> _ Public Function delCurTable(ByVal tbName As String) As Boolean Try Return True Catch

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器