在网上也找了一些,发现要么题目和内容不对应,明明是在 Winform 下异步调用,却写成在 Asp.net 异步调用 WebService ,有的调用方式在 .NET3.5 下不能通过, .NET3.5 下取消了 BeginXXXX,EndXXXX ,奇怪,而用了以下方式。
建立一个 WebService 和一个 WebApplication 如图所示:
WebService 代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebService1
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[ WebService (Namespace = "http://tempuri.org/" )]
[ WebServiceBinding (ConformsTo = WsiProfiles .BasicProfile1_1)]
[System.ComponentModel. ToolboxItem ( false )]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services. WebService
{
[ WebMethod ]
public string HelloWorld()
{
return "Hello World" ;
}
}
}
以下为 同步调用 WebService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : System.Web.UI. Page
{
protected void Page_Load( object sender, EventArgs e)
{
// 同步调用 WebService
Response.Write( "aaa<br>" );
localhost. Service1 n = new localhost. Service1 ();
Response.Write(n.HelloWorld().ToString()+ "<br/>" );
Response.Write( "bbb<br>" );
}
}
}
输出结果:
aaa
Hello World
bbb
以下为 异步调用 WebService
1 、需要在 Default.aspx 页的 Page 里加入 Async="true"
<% @ Page Language ="C#" AutoEventWireup ="true" CodeBehind ="Default.aspx.cs" Inherits ="WebApplication1._Default" Async ="true" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server">
< title ></ title >
</ head >
< body >
< form id ="form1" runat ="server">
< div >
</ div >
</ form >
</ body >
</ html >
2 、在 Default.aspx.cs 里代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : System.Web.UI. Page
{
protected void Page_Load( object sender, EventArgs e)
{
// 异步调用 WebService
Response.Write( "aaa<br>" );
localhost. Service1 n = new localhost. Service1 ();
n.HelloWorldCompleted += delegate ( object sender2, localhost. HelloWorldCompletedEventArgs e2)
{
//e.Result 获取处理结果
Response.Write(e2.Result.ToString()+ "<br/>" );
};
n.HelloWorldAsync();
Response.Write( "bbb<br>" );
}
}
}
运行结果:
aaa
bbb
Hello World
试验结果: 发现 Hello World 时在输出 aaa,bbb 之后输出 Hello World 的。
使用总结:
1、在ASPX页面设置一个允许异步调用的属性 Async="true"这样就可以在这个页面里进行异步调用了
2、同步调用的方法和异步调用的方法不一样,异步调用的方法是WebServic的方法名+Async()作为方法名,同步调用的方法就是WebService的方法名。
以上采用了匿名方法。将方法体的代码和委托对象相关联,如果要单独定义一个方法,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : System.Web.UI. Page
{
protected void Page_Load( object sender, EventArgs e)
{
// 异步调用 WebService
Response.Write( "aaa<br>" );
localhost. Service1 n = new localhost. Service1 ();
n.HelloWorldCompleted += new localhost. HelloWorldCompletedEventHandler (HelloWorldCompleted);
n.HelloWorldAsync();
Response.Write( "bbb<br>" );
}
// 完成事件处理方法
void HelloWorldCompleted( object sender, localhost. HelloWorldCompletedEventArgs e)
{
if (e.Error != null )
throw e.Error;
Response.Write(e.Result.ToString() + "<br>" ); //e.Result 获取处理结果
}
}
}