这里只讲操作过程,及操作过程中的说明,纯理论的东西不讲,但需注意一点:WebService是为面向服务编程所提供的技术,服务器在一定范围内公开对外“接口”,客户端不论是是asp.net还是java等都可调用这个“接口”以进行数据交互(注意:当服务端代码更改后,客户端一定要“更新服务引用”)
方式一:同步WebService
方式二:异步调用
方式三:开启新线程执行异步操作
同步WebService
服务端
新建空项目WebServiceDemo
图01
删除原有WebServiceDemo建立WService项目
图02
在Wservice项目中新建WSDemo.asmx文件
图03
到此,服务端操作完毕
客户端
在WebServiceDemo上右击新建Wclient项目,并新建Index.aspx页
图04
按F5让网站运行起来,此时,在电脑“任务栏”中应该有两个ASP.NET Development Server,注意区分哪个是服务端的,哪个是客户端的
停止调试,在Wclient项目中添加“服务引用”,注意不是“引用”
图05、06
在Index.aspx.cs中输入以下代码
protected void Page_Load(object sender, EventArgs e)
{
//释放托管资源,所以加 using
//ServiceReference1在新得到的Service References 下
//WSDemoSoapClient是服务端的WSDemo.asmx在客户端的接口,和类一样,要先创建实例
using (ServiceReference1.WSDemoSoapClient wsc = new WSDemoSoapClient())
{
string result = wsc.HelloWorld();//HelloWorld为wsc实例下的方法,返回的是字符串"Hello World"
Response.Write(result);//得到值后输出到页面
}
}
将Wclient和Index.aspx分设启动项和启动页,运行网站,此时就能从客户端得到服务端提供的方法的返回值”Hello World”
图07
此时,客户端操作完毕,服务端、客户端均操作完毕
异步调用
接着上面的操作在ServiceReference1(Service References下面)上右击---->配置服务引用---->使”异步操作”处于选中状态,并确定
图08、09
在前台Index.aspx头部中加下Async="true",如:
<%@ Page Language="C#" Async="true" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Wclient.Index" %>
在Index.aspx.cs中输入以下代码
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//释放托管资源,所以加 using
//ServiceReference1在新得到的Service References 下
//WSDemoSoapClient是服务端的WSDemo.asmx在客户端的接口,和类一样,要先创建实例
using (ServiceReference1.WSDemoSoapClient wsc = new WSDemoSoapClient())
{
//由于是异步执行,不知道什么时候执行完毕,因此采用事件驱动机制
wsc.HelloWorldCompleted += new EventHandler<HelloWorldCompletedEventArgs>(wsc_HelloWorldCompleted);
//当事件驱动机制启动并完成后,就立即执行
wsc.HelloWorldAsync();
}
}
//事件中执行的方法
void wsc_HelloWorldCompleted(object sender, HelloWorldCompletedEventArgs e)
{
string result = e.Result;
Response.Write(result);
}
}
此时,异步操作的客户端操作完毕
在WSDemo.asmx.cs中输入以下代码
public class WSDemo : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
System.Threading.Thread.Sleep(3000);//停3000ms(即3m),好让异步看出效果
return "Hello World";
}
}
此时,异步操作的服务端操作完毕,服务端、客户端均操作完毕,运行即可看到过三秒后客户端页面显示出服务端提供方法的返回值”Hello World”
开启新线程执行异步操作
接着上面的操作完成内容,删除Index.aspx.cs中的一部分代码,使之恢复到新建立时模样 public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
之后添加using System.ComponentModel;命名空间并输入以下代码
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
BackgroundWorker backgroundWorker = new BackgroundWorker();
//指名开启一个线程后要执行的方法
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
//当后台操作完成之后要执行的方法
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
//正式执行
backgroundWorker.RunWorkerAsync();
}
//当后台操作完成之后要执行的方法
void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Response.Write(e.Result);//得到服务端返回的值后,输出到客户端页面,注意此时还没有输出
}
//开启一个线程后要执行的方法
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//在开启线程后执行的方法中建立服务端和客户端的链接
using (ServiceReference1.WSDemoSoapClient wsd = new WSDemoSoapClient())
{
e.Result = wsd.HelloWorld();//调用服务端的方法,并将返回值赋给 e.Result
}
}
}
此时,开启线程并异步操作的客户端操作完毕,服务端不变,服务端、客户端均操作完毕,运行即可看到过三秒后客户端页面显示出服务端提供方法的返回值”Hello World”
在这一章中,服务端方式返回的是字符串,在实际的项目中,可更据需要返回任意类型,数据集等
再下一章中,将介绍客户端向服务端传入参数的数据交互方式