WebService二2003.ppt

上传人:本田雅阁 文档编号:2128217 上传时间:2019-02-19 格式:PPT 页数:34 大小:295.51KB
返回 下载 相关 举报
WebService二2003.ppt_第1页
第1页 / 共34页
WebService二2003.ppt_第2页
第2页 / 共34页
WebService二2003.ppt_第3页
第3页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《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的状

4、态管理变得简单了。 Session对象中存储的数据只有在WebMethod属性的EnableSession属性设置为true来使用WebService派生的类时才可用。 WebService派生的类自动可访问Application对象。,Web服务的状态-4,如何访问和保存特定客户端会话的特定状态?如果用Session保存状态的话 System.Net.CookieContainer cc = new System.Net.CookieContainer(); 创建一个CookieContainer来关联Session,要想使用CookieContainer,需要首先定义一个CookieCon

5、tainer常量,作用域为整个应用程序域,这样可以保证该应用程序域每次访问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方法,添加如下的代码 Web

6、Method(EnableSession = true) public string getname() return (string)Session“name“; WebMethod(EnableSession = true) public void setname(string aa) Session“name“ = aa; ,利用Web服务传递信息状态 之Web服务-3,4. 测试Web服务。首先测试setname方法,设置输入为:1111。,利用Web服务传递信息状态 之Web服务-4,5. 执行getname方法,结果如下:,利用Web服务传递信息状态 之Web服务-5,6. 发布网

7、站到默认的发布目录(C:Documents and SettingsAdministratorMy DocumentsVisual Studio 2005ProjectswebsessionPrecompiledWeb)。 7. 将默认的发布目录下的websession文件夹直接复制,放到C:Inetpubwwwroot目录下,然后将该目录设置为虚目录。,利用Web服务传递信息状态之WinForm客户端调用程序 -1,1. 新建一个项目,选择“Windows应用程序”,项目名称“Websessionclient”。 2. 选中解决方案资源管理器的引用,点击鼠标右键,从弹出的菜单里点击“添加We

8、b引用”(选择刚才创建的websession)。 3. 往窗体上放三个控件: button1的Text属性设置为:获取Web服务的数据。 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 =

9、 new System.Net.CookieContainer(); aa.CookieContainer = cc; aa.setname(“1111“); this.textBox1.Text = aa.getname(); ,利用Web服务传递信息状态之WinForm客户端调用程序 -3,5. 执行程序结果如下:,异步调用的基本概念-1,当服务器端方法执行时间过长,客户端无法及时进行交互时,为了不影响客户端的用户体验,给客户一个良好的感觉,并让客户能及时的进行交互,我们必须使用异步调用。 异步调用的实质:异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间

10、的任务在后台执行而不影响调用方的其他行为。 .NET Framework为异步操作提供两种设计模式: 使用IAsyncResult对象的异步操作 使用事件的异步操作,异步调用的基本概念-2,在.NET Framework 2.0版中,Web服务描述语言工具(Wsdl.exe)生成的代理代码支持新的使用基于事件的异步模式进行多线程编程。通过将事件驱动的异步编程模型与ASP.NET 2.0 Web客户端的自动代理生成相结合,您可以迅速开发出高性能的基于Web服务的Web应用程序。 基于事件的异步模式的类将有一个或多个名为MethodNameAsync的方法。这些方法可能会创建同步版本的镜像,这些同

11、步版本会在当前线程上执行相同的操作。此类还可能有一个MethodNameCompleted事件,而且它可能会有一个MethodNameAsyncCancel(或只是 CancelAsync)方法。,异步调用的实现步骤,1. 新建一个Web服务。因为是客户端实现异步调用,所以服务器端就是一个普通的Web服务。 2. 客户端先添加引用,就会在客户端形成代理对象。代理对象里会自动生成异步调用的方法,在客户端调用该方法就可以实现异步发送客户端请求。代理对象的源代码如下:,异步调用Web服务之Web服务 -1,1. 新建网站(webAsync),使用Visual Studio 2005创建网站,并且选择

12、“ASP.NET Web服务”目模板,选择C:webserviceprj2webAsync目录,点击确定。 2. 删除HelloWorld方法,添加如下的代码: WebMethodpublic string 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应用程序”,

13、项目名称“Webasyncclient”。 2. 选中解决方案资源管理器的引用,点击鼠标右键,从弹出的菜单里点击“添加Web引用”(选择刚才创建的webAsync)。 3. 往窗体上放两个控件: Button1的Text属性设置为:调Web服务。 Button2的Text属性设置为:显示信息。,异步调用Web服务之客户端调用 -2,4. Web服务异步调用。在button1_Click事件里添加如下代码: private void button1_Click(object sender, EventArgs e) localhost.Service service = new localhos

14、t.Service(); service.getStringCompleted += new localhost.getStringCompletedEventHandler(service_getStringCompleted); service.getStringAsync(); ,异步调用Web服务之客户端调用 -3,5. 添加方法如下: void service_getStringCompleted(object sender, localhost.getStringCompletedEventArgs e) if (e.Error = null) MessageBox.Show(e.

15、Result); else MessageBox.Show(e.Error.Message); ,异步调用Web服务之客户端调用 -4,6. 在button1_Click事件里添加如下代码: private void button2_Click(object sender, EventArgs e) MessageBox.Show(“客户端信息“); ,异步调用Web服务之客户端调用 -5,7. 执行程序。首先点击“调Web服务”按钮,然后点击“显示信息”按钮。按照点击的顺序如果是同步调用必然是先显示“ok”,然后显示“客户端信息”。可因为是异步调用所以结果如下:,跨语言调用,Web Serv

16、ice可以通过HttpGet、HttpPost和Soap协议进行调用,而这些协议又都是W3C定义的公有协议,支持所有的语言。所以使用任何语言开发的Web服务都可以被其他语言来调用,只是在调用过程中,必须注意的参数的数据类型,标准通用的数据类型,再跨语言调用时没有问题,一些特殊的数据类型不能直接调用,必须进行转化为通用类型才可以。利用int,String等基础类型都可以直接作为参数的数据类型来使用,而DataSet类型因为是.NET平台独有的,所以方法的返回结果如果是DataSet,那么该方法就不能在其他语言进行调用,必须将方法的结果修改为响应的集合才可以。当一个Web服务的方法考虑到将来有可能

17、要进行跨语言调用,就必须考虑它的参数和返回值的数据类型符合统一的规范,否则就无法实现跨语言调用。,利用Java调用.NET的Web服务 之Web服务 -1,1. 新建网站(Webnet_java),使用Visual Studio 2005创建网站,并且选择“ASP.NET Web服务”目模板,选择C:webserviceprj2Webnet_java目录,点击确定。 2. 删除HelloWorld方法,添加如下的代码: WebMethodpublic string add(int a,int b) return (a+b).ToString(); ,利用Java调用.NET的Web服务 之We

18、b服务 -2,3. 测试Web服务。 4. 发布网站并创建“Webnet_java”的虚目录。,利用Java调用.NET的Web服务 之客户端调用 -1,1. 打开jbuilder2006,新建一个项目,添加一个java class,命名为TestNetService。 2. 在项目中添加对组件的引用:axis和borlandxml(在项目属性里的required libraries里添加。 3. 编写如下代码:,利用Java调用.NET的Web服务 之Web服务 -4,import java.util.Date; import java.text.DateFormat; import jav

19、a.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 javax.xml.rpc.ParameterMode; public class TestNetService public TestNetService() public static void main(String args

20、) 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(); Call call =(Call)service.createCall(); call.setTargetEndpointAddress(new .URL(endpoint); call.setO

21、perationName(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 ,javax.xml.rpc.ParameterMode.IN); call.setReturnType(org.apache.axis.encoding.XMLTy

22、pe.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实现文件的上传下载,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1