《WebService二2003.ppt》由会员分享,可在线阅读,更多相关《WebService二2003.ppt(34页珍藏版)》请在三一办公上搜索。
1、企业级应用和WebService二,教学目标,掌握Web服务里的状态传递掌握Web服务的异步调用了解Web服务的跨语言调用,工作任务,1.利用Web服务实现两个页面之间的信息传递2.使用winform应用程序调用Web服务3.用java调用.net创建Web服务,Web服务的状态-1,Web Service由于采用了HTTP作为缺省通讯协议,使得Web Service可以透过各个企业、公司的防火墙,真正实现了跨internet的分布式计算。也因为HTTP,使得Web Service在本质上存在一些先天的限制,就像其它的WEB应用程序一样。HTTP是一种无状态的(STATELESS)通讯协议,所
2、以在HTTP之上的Web Service如何保持“状态(STATE)”就成为一个有趣的话题。请看如下代码:localhost.Service aa=new localhost.Service();aa.setname(wanglaoshi);aa.getname();,Web服务的状态-2,看起来你只创建了一个Service实例(Object),并两次调用它的函数。但实际情况却非如此。你没有创建一个Service实例,你只是创建了Service类的代理类的实例(Proxy Class)。Service类的实例是在服务器端创建的,而且是两次。你在客户端两次的函数调用在服务器端生成了两个实例,每个
3、实例响应一次函数调用。两个实例之间没有任何联系,当你把第一个实例的name设为wanglaoshi,对于第二个实例来讲是全然无知的。所以调用“aa.getname();”结果仍然是空。,Web服务的状态-3,Web Service的实例创建是属于REMOTING中单一调用方式的(SINGLE CALL)。意思是每一次的函数调用都会在服务器端创建一个新的实例。在默认情况下,.NET下的WebService是无状态的。那么如何解决保存“状态”呢?可以用ASP.NET提供的状态管理那就是Session和Application。这使得WebService的状态管理变得简单了。Session对象中存储的
4、数据只有在WebMethod属性的EnableSession属性设置为true来使用WebService派生的类时才可用。WebService派生的类自动可访问Application对象。,Web服务的状态-4,如何访问和保存特定客户端会话的特定状态?如果用Session保存状态的话 System.Net.CookieContainer cc=new System.Net.CookieContainer();创建一个CookieContainer来关联Session,要想使用CookieContainer,需要首先定义一个CookieContainer常量,作用域为整个应用程序域,这样可以保证
5、该应用程序域每次访问Web Service均被识别为同一个用户。如果使用Application对象保存就和一样,利用Web服务传递信息状态 之Web服务-1,1.新建网站(websession),使用Visual Studio 2005创建网站,并且选择“ASP.NET Web服务”目模板,选择C:webserviceprj2websession目录,点击确定。2.首先声明一个私有变量。private string name;,利用Web服务传递信息状态 之Web服务-2,3.删除HelloWorld方法,添加如下的代码WebMethod(EnableSession=true)public s
6、tring getname()return(string)Sessionname;WebMethod(EnableSession=true)public void setname(string aa)Sessionname=aa;,利用Web服务传递信息状态 之Web服务-3,4.测试Web服务。首先测试setname方法,设置输入为:1111。,利用Web服务传递信息状态 之Web服务-4,5.执行getname方法,结果如下:,利用Web服务传递信息状态 之Web服务-5,6.发布网站到默认的发布目录(C:Documents and SettingsAdministratorMy Docu
7、mentsVisual Studio 2005ProjectswebsessionPrecompiledWeb)。7.将默认的发布目录下的websession文件夹直接复制,放到C:Inetpubwwwroot目录下,然后将该目录设置为虚目录。,利用Web服务传递信息状态之WinForm客户端调用程序-1,1.新建一个项目,选择“Windows应用程序”,项目名称“Websessionclient”。2.选中解决方案资源管理器的引用,点击鼠标右键,从弹出的菜单里点击“添加Web引用”(选择刚才创建的websession)。3.往窗体上放三个控件:button1的Text属性设置为:获取Web服
8、务的数据。textBox1一切属性使用默认的。,利用Web服务传递信息状态之WinForm客户端调用程序-2,4.Web服务静态调用的代码如下:在button1_Click事件里添加如下代码:protected void button1_Click(object sender,EventArgs e)localhost.Service aa=new localhost.Service();System.Net.CookieContainer cc=new System.Net.CookieContainer();aa.CookieContainer=cc;aa.setname(1111);th
9、is.textBox1.Text=aa.getname();,利用Web服务传递信息状态之WinForm客户端调用程序-3,5.执行程序结果如下:,异步调用的基本概念-1,当服务器端方法执行时间过长,客户端无法及时进行交互时,为了不影响客户端的用户体验,给客户一个良好的感觉,并让客户能及时的进行交互,我们必须使用异步调用。异步调用的实质:异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。.NET Framework为异步操作提供两种设计模式:使用IAsyncResult对象的异步操作使用事件的异步操作,异步调用的基本概
10、念-2,在.NET Framework 2.0版中,Web服务描述语言工具(Wsdl.exe)生成的代理代码支持新的使用基于事件的异步模式进行多线程编程。通过将事件驱动的异步编程模型与ASP.NET 2.0 Web客户端的自动代理生成相结合,您可以迅速开发出高性能的基于Web服务的Web应用程序。基于事件的异步模式的类将有一个或多个名为MethodNameAsync的方法。这些方法可能会创建同步版本的镜像,这些同步版本会在当前线程上执行相同的操作。此类还可能有一个MethodNameCompleted事件,而且它可能会有一个MethodNameAsyncCancel(或只是 CancelAsy
11、nc)方法。,异步调用的实现步骤,1.新建一个Web服务。因为是客户端实现异步调用,所以服务器端就是一个普通的Web服务。2.客户端先添加引用,就会在客户端形成代理对象。代理对象里会自动生成异步调用的方法,在客户端调用该方法就可以实现异步发送客户端请求。代理对象的源代码如下:,异步调用Web服务之Web服务-1,1.新建网站(webAsync),使用Visual Studio 2005创建网站,并且选择“ASP.NET Web服务”目模板,选择C:webserviceprj2webAsync目录,点击确定。2.删除HelloWorld方法,添加如下的代码:WebMethodpublic str
12、ing getString()double total=0;for(int i=0;i 1000000000;i+)total+=i;return ok;,异步调用Web服务之Web服务-2,3.测试,出现界面如下图表示成功。4.发布Web服务并建虚目录webAsync。,异步调用Web服务之客户端调用-1,1.新建一个项目,选择“Windows应用程序”,项目名称“Webasyncclient”。2.选中解决方案资源管理器的引用,点击鼠标右键,从弹出的菜单里点击“添加Web引用”(选择刚才创建的webAsync)。3.往窗体上放两个控件:Button1的Text属性设置为:调Web服务。Bu
13、tton2的Text属性设置为:显示信息。,异步调用Web服务之客户端调用-2,4.Web服务异步调用。在button1_Click事件里添加如下代码:private void button1_Click(object sender,EventArgs e)localhost.Service service=new localhost.Service();service.getStringCompleted+=new localhost.getStringCompletedEventHandler(service_getStringCompleted);service.getStringAsy
14、nc();,异步调用Web服务之客户端调用-3,5.添加方法如下:void service_getStringCompleted(object sender,localhost.getStringCompletedEventArgs e)if(e.Error=null)MessageBox.Show(e.Result);elseMessageBox.Show(e.Error.Message);,异步调用Web服务之客户端调用-4,6.在button1_Click事件里添加如下代码:private void button2_Click(object sender,EventArgs e)Mess
15、ageBox.Show(客户端信息);,异步调用Web服务之客户端调用-5,7.执行程序。首先点击“调Web服务”按钮,然后点击“显示信息”按钮。按照点击的顺序如果是同步调用必然是先显示“ok”,然后显示“客户端信息”。可因为是异步调用所以结果如下:,跨语言调用,Web Service可以通过HttpGet、HttpPost和Soap协议进行调用,而这些协议又都是W3C定义的公有协议,支持所有的语言。所以使用任何语言开发的Web服务都可以被其他语言来调用,只是在调用过程中,必须注意的参数的数据类型,标准通用的数据类型,再跨语言调用时没有问题,一些特殊的数据类型不能直接调用,必须进行转化为通用类
16、型才可以。利用int,String等基础类型都可以直接作为参数的数据类型来使用,而DataSet类型因为是.NET平台独有的,所以方法的返回结果如果是DataSet,那么该方法就不能在其他语言进行调用,必须将方法的结果修改为响应的集合才可以。当一个Web服务的方法考虑到将来有可能要进行跨语言调用,就必须考虑它的参数和返回值的数据类型符合统一的规范,否则就无法实现跨语言调用。,利用Java调用.NET的Web服务 之Web服务-1,1.新建网站(Webnet_java),使用Visual Studio 2005创建网站,并且选择“ASP.NET Web服务”目模板,选择C:webservicep
17、rj2Webnet_java目录,点击确定。2.删除HelloWorld方法,添加如下的代码:WebMethodpublic string add(int a,int b)return(a+b).ToString();,利用Java调用.NET的Web服务 之Web服务-2,3.测试Web服务。4.发布网站并创建“Webnet_java”的虚目录。,利用Java调用.NET的Web服务 之客户端调用-1,1.打开jbuilder2006,新建一个项目,添加一个java class,命名为TestNetService。2.在项目中添加对组件的引用:axis和borlandxml(在项目属性里的r
18、equired libraries里添加。3.编写如下代码:,利用Java调用.NET的Web服务 之Web服务-4,import java.util.Date;import java.text.DateFormat;import java.util.Date;import java.text.DateFormat;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import javax.xml.namespace.QName;import java.lang.Integer;import jav
19、ax.xml.rpc.ParameterMode;public class TestNetServicepublic TestNetService()public static void main(String args)try,利用Java调用.NET的Web服务 之Web服务-5,Integer i=new Integer(1);Integer j=new Integer(2);String endpoint=http:/localhost/MyServices/WebServiceTest/SumService.asmx;Service service=new Service();Cal
20、l call=(Call)service.createCall();call.setTargetEndpointAddress(new.URL(endpoint);call.setOperationName(new QName(http:/tempuri.org/,IntAdd);call.addParameter(“i,org.apache.axis.encoding.XMLType.XSD_INT,javax.xml.rpc.ParameterMode.IN);call.addParameter(“j,org.apache.axis.encoding.XMLType.XSD_INT,jav
21、ax.xml.rpc.ParameterMode.IN);call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);call.setUseSOAPAction(true);call.setSOAPActionURI(epayal.logical);Integer k=(Integer)call.invoke(new Objecti,j);System.out.println(result is+k.toString()+.);,利用Java调用.NET的Web服务 之Web服务-6,catch(Exception e)System.err.println(e.toString();4.编译、执行程序运行结果返回“3”。说明java调用.net的web服务正确。,总结,Web服务里的状态信息可以通过Session和Application对象来实现Web服务可以实现异步调用Web服务最大的优点就是跨语言调用,可以使用一种语言编写Web服务而使用另一种语言进行调用,案例,通过WebService实现文件的上传下载,