19Web服务
Web服务
Web服务
Micosoft.Net平台架构中的分布式系统主要包括两部分:用ASP.Net技术构建服务器端动态网页,以及Web服务(Web Service或XML Web Service)。前边章节已详细介绍了构建服务器端动态网页的方法,本章将介绍Web服务的基本概念和构建方法。
13.1 Web服务的概念和用途
Web中无论是静态网页还是动态网页,数据都被嵌入到网页中,网页的服务对象都是人,用户可以很容易阅读这些网页。但如果一个程序使用这种方式获得数据,会是十分困难的,程序必须从网页中把数据分离,才能加以利用。而用一个程序在Web中获得数据有时又是十分必要的,例如:一个气象台总站希望通过Internet获得各个基层气象台的各种资料,在网上以统一的网页对外发布。气象台总站希望各个基层气象台提供一个Internet的服务,能根据总站的要求,自动提供相应的资料。类似的例子很多,例如一个大单位的总部和下属单位之间信息系统的整合,一个综合网站希望自动获得其它网站提供的信息等等。这种需求实际上就是Web服务。
为实现这种功能有很多困难,各个基层气象台使用的系统可能完全不同,即使使用相同的操作系统,也可能使用不同数据库系统,数据库中定义的字段可能不同,数据库应用程序可能使用不同的语言编制,即使这些完全相同,还可能数据的表示方式不相同,例如数据格式,数据的位数等等。为解决这些问题,已提出了许多方案,例如:微软的分布式控件对象模型(DCOM)、对象管理组织(OMG)的公用对象请求代理程序体系结构(CORBA)、SUN公司的远程方法调用(RMI)等等,但这些方法都不能很好的解决以上问题。
Micosoft.Net的Web服务为实现这种功能提供了完整的解决方案。Web服务使用XML描述数据,保证程序可以理解数据;用SOAP协议把XML数据封装为消息,SOAP(Simple Object Access Protocol,简单对象访问协议)是基于XML的消息传递协议,由于是基于XML,保证了不同系统的不同程序之间,只要支持SOAP,都可以互相通信;用Http协议在Internet上传输SOAP消息。用Micosoft.Net的Web服务实现气象台总站所需功能的大概思路是这样的,每个基层气象台在自己的系统中提供一个Internet远程调用函数,该函数用HTTP协议接受用SOAP表示的调用,并把函数的返回值用XML扩展标记语言描述,用SOAP表示后,用HTTP协议返回给调用者。气象台总站只要使用HTTP和SOAP协议逐一调用这些Web远程函数,就可以获得各个基层气象台返回的用XML表示的资料了,用程序很容易分析、提取XML表示的资料中的数据。由于这些协议都是被不同系统广泛接受的协议,XML数据可以被不同系统的不同程序所理解,也就解决了以上所提出的问题。
由以上叙述可知,Web服务不追求代码的可移植性,而是提供一个可行的解决方案来实现不同系统程序之间的数据通讯和理解。有许多Web服务的定义,比较简单又比较容易理解的描述是:Web服务是一个独立于系统的,可通过HTTP、SOAP和XML协议进行访问的Web远程函数库。
刚才讨论的问题只是Web服务的几个应用,还有许多其它用途,例如:
l 应用程序集成
可以使用Web服务以一种集成的方式整合表面上看上去完全不同的现有应用程序。例如许多公司的每个部门都有定制的软件,产生一系列有用但是孤立的数据和业务逻辑。为了管理上的方便,非常有必要把这些应用程序功能集合到一起。利用Web服务,就有可能把现有的应用程序中的数据和功能以Web服务方式提供给其它部门。然后可以创建一个集成的应用程序,增强各部门之间的互操作性。
l 代码复用
在软件开发行业,大部分软件开发者都依赖代码复用。过去软件开发者为了利用他人已经实现的代码,或者将代码段复制到自己的代码中,做一些改动以适应自己得需要,或者在服务器或个人计算机上安装一个库,让应用程序来访问这个库。这将使得代码有很多个版本,而这些版本间可能只有细微差别,却分散在各个地方。当代码最初的开发者决定对代码更新一下或者改正一下错误,要把这些改变告诉所有使用这些代码的开发者的时候,将是非常困难的。如果我们把代码放在一个中心位置存储,让所有人都访问这儿,这不是很好吗?这样原创者可以在做了一些增补或者修正之后,能够立即提供给所有使用它的人。用Web服务可以实现以上设想,远程调用Web服务中的方法,就象调用本地函数一样方便。
l 工作流程解决方案
有些工作是非常复杂的,例如货物的运输,可能要使用多种交通工具,火车、汽车、轮船等,是一个非常复杂的流程,流程的每一个环节都由不同部门的不同的程序进行控制,如何建立这些控制程序之间的联系,是十分重要的。使用Web服务是一个很好的解决方案。通过Web服务,使各个流程控制程序建立联系,完全实现货物运输的自动控制和管理。
l 新的销售方式
现在软件的销售方式一般是用户把软件买回去,安装在自己的计算机中。有了Web服务,就可以提供软件的使用服务,用户可以远程使用应用软件,按次收费。
l 由Web服务组成的自动化系统
不远的将来,信息家电将要联接到Internet网上,PDA、手机,甚至各种嵌入式设备也要上网,这些设备和其它设备之间通过Web服务建立联系也是一种可行的方案。
13.2 建立Web服务
Web服务仍采用客户/服务器模式(Client/Server)。本节介绍在服务器端应做的工作,包括建立供客户端调用的Web服务方法,以及为了客户端使用Web服务方法,提供给客户端描述该Web服务的WSDL文档。
13.2.1 用记事本建立Web服务
例子e13_2_1A:建立一个Web服务文件和建立一个普通网页文件的步骤基本一样,下边是一个最简单的Web服务文件,其它程序访问其中的Web服务方法时,将返回参数a和b的和,具体程序代码如下:
<%@ WebService Language="C#" class="MyClass"%>
using System;
using System.Web.Services;
public class MyClass:WebService
{ [WebMethod]
public int MyWebMethod (int a,int b)//注意形参的名称将在图13.2.1C中出现
{ return a+b;
}
//其它WebMethod
}
在文件中,第一行的语句表示这是一个Web服务文件,使用C#语言,Web服务的类名是MyClass。第4条语句创建了一个以WebService类为基类的派生类MyClass,该类必须是一个公有类。建立的Web服务类不必以WebService类为基类,但从WebService类派生,可获得对ASP.Net对象(例如Application和Session)的访问权限。如以WebService 类为基类必须引入命名空间System.Web.Services。可供网上其它程序访问的方法叫Web服务方法,在其头部必须增加关键字[WebMethod],表示这个方法是一个Web服务方法,这个方法必须是一个公有方法。
建立文件后,以asmx为扩展名存盘,存到网站的宿主目录中或其任意子目录中,本例以e13_2_1.asmx存到网站的宿主目录下的WriteBook目录中。现在使用浏览器测试这个Web服务方法,使用URL定位这个Web服务方法,在浏览器中URL地址栏中输入如下地址:http://localhost/ WriteBook/e13_2_1.asmx,浏览器中显示如图13.2.1A。
图13.2.1A
在网页中可以看到建议:"此Web服务使用http://tempuri.org/作为它的默认命名空间。建议:在使XML Web service公开之前,请更改默认命名空间"。这段话的意思是说为了和其它Web服务相区别,在发布Web服务时,必须有唯一的命名空间,可以使用自己单位的网址或IP地址作为此命名空间。修改e13_3_1A.asmx为e13_3_1.asmx如下:
<%@ WebService Language="C#" class="MyClass"%>
using System;
using System.Web.Services;
[WebService(Namespace="http://202.206.96.204/")]
public class MyClass:WebService
{ [WebMethod]
public int MyWebMethod (int a,int b)
{ return a+b;
}
//其它WebMethod
}
再一次用网址http://localhost/e13_2_1.asmx运行,将不出现建议部分,如图13.2.1B所示。
图13.2.1B
点击MyWebMethod,浏览器中显示如图13.2.1C。
图13.2.1C
在编辑框中输入两个加数分别为10和20,然后点击"调用"按钮,打开另一浏览器窗口如图13.2.1D,这是用XML标记表示的调用Web服务方法MyWebMethod返回的结果。请注意,这里运行只是一种测试,实际上应在其它计算机上生成一个调用此Web服务的客户端程序,可以是Windows应用程序,也可以是控制台程序,或者是ASP.Net应用程序,即可以是Micosoft.Net系统程序,也可以是其它系统程序,例如Java程序,Linux程序等等,下节将介绍这方面的知识。
图13.2.1D
13.2.2 用VS.Net建立Web服务
如果使用VS.Net建立这个Web服务文件,具体步骤如下:
(1) 新建asp.Net web服务项目,在"位置(L)"编辑框中键入:http://localhost/e13_2_2,其中e13_2_2就是项目的名字。单击"确定"按钮,创建项目。
(2) 可以看到标题为"Service1.asmx.cs(设计) "窗口。右击该文件,在弹出快捷菜单中单击"查看代码(C)" 菜单项,打开Service1.asmx.cs源文件如图13.2.2。
图13.2.2
(3)为了在访问时不出现建议提示,在Service1类定义的前边加入如下语句:[WebService(Namespace="http://202.206.96.204/")]。
(4) 文件中已有一个Web服务方法HelloWorld,但被注释掉。下面增加一个Web服务方法MyWebMethod如下:
[WebMethod]
public int MyWebMethod(int a,int b)
{ return a+b;
}
(5) 现在用IE浏览器测试这个Web服务,按F5运行,将显示类似图13.2.1B的界面(类名不同),点击MyWebMethod,浏览器中显示如图13.2.1C。在编辑框中输入两个加数分别为10和20,然后点击"调用"按钮,打开另一浏览器窗口如图13.2.1D,这是用XML表示的调用Web服务方法MyWebMethod返回的结果。
13.2.3 服务描述语言(WSDL)
Web服务提供了一种服务,允许Internet上的计算机使用HTTP和SOAP协议远程调用Web服务方法。大家都知道,为了使用一个函数,首先要看一下函数的使用说明。Web服务方法也存在同样的问题,特别是SOAP协议,它采用XML标记语言描述Web服务中传递的消息,而XML标记语言是可以定义自己的标记的,但SOAP并没有提供一种通用的XML标记供Web服务使用,不同的Web服务中SOAP的XML标记定义可能不同。因此,为了使不同系统调用其它系统中的Web服务,必须对调用Web服务的方法及Web服务返回的数据的格式做详细说明即服务描述,而且这种描述也应采用被广泛接受的协议。
WSDL(Web Services Description Language)中文名称为Web服务描述语言,用来对Web服务进行说明。WSDL是基于XML的,用WSDL生成一个XML文档,可以提供关于Web服务的操作信息,例如,抽象形式的服务接口信息、数据传输的具体访问协议和格式、供客户端使用该Web服务的细节等等。服务描述是一个使用WSDL语言的XML文档,定义了Web服务能理解的Web服务消息格式。服务描述起一个协定的作用,用来定义一个Web服务的行为并且指示潜在的客户如何与之交互。WSDL文档最重要的的用途就是在客户端生成代理类,详情见13.3.3节。
由于在VS.Net可以自动生成WSDL文档,这里就不介绍WSDL了。可以通过下边方法看到VS.Net自动生成的WSDL文档,例如查看上节生成的Web服务,在浏览器中URL地址中输入http://localhost/ e13_2_2/Service1.asmx?WSDL,浏览器中显示该Web服务WSDL文档。或者单击图13.2.1B中的服务说明,也可看到这个WSDL文档。
13.3 基于.Net的Web服务客户端程序
Web服务客户端程序是用来调用服务器端的Web服务方法,前边使用浏览器调用Web服务方法,只能算做一种测试,通过这种测试,可以验证Web服务方法的正确性,发现错误。作为客户端程序,无论在何处,采用那种操作系统,希望只要知道Web服务的所在网址,就可以调用其相关Web服务方法。Web服务客户端程序一般应在Web网上的另一台计算机中,仅仅做实验或学习,也可以和Web服务在同一台计算机中。本节介绍如何实现基于.Net的Web服务客户端程序。
13.3.1 调用Web服务方法采用的协议
客户端可采用3种协议调用Web服务方法: HTTP-GET、HTTP-POST和SOAP协议。HTTP-GET和HTTP-POST协议是Web网页传递参数的标准协议。使用HTTP-GET调用e13_2_1.asmx 中的Web服务方法,可在IE浏览器的地址栏中输入如下内容,将返回图13.2.1D网页,注意a和b是Web服务方法的形参名称。
http://localhost/WriteBook/e13_2_1.asmx/MyWebMethod?a=10&b=20
如果使用HTTP-POST调用e13_2_1.asmx 中的Web服务方法,可采用如下网页:
<html>
<body>
<form method="POST" action="e13_2_1.asmx/MyWebMethod">
输入第1个加数a:<input name="a" Value=""><br>
输入第2个加数b:<input name="b" Value=""><br>
<input type="submit" value="调用Web服务">
</form>
</body>
</html>
用记事本程序输入此网页,注意a和b是Web服务方法的形参名称,以e13_3_1.htm为文件名存入e13_2_1.asmx所在的文件夹。用浏览器打开此网页,浏览器显示效果如下。按图所示输入两个加数,单击调用Web服务按钮,将返回图13.2.1D网页。
图13.3.1A
使用HTTP-GET和HTTP-POST协议传递Web网页参数只能采用变量名/变量值对,无法传递象DataSet、二进制文件等数据类型,为了传递复杂数据类型,可采用SOAP协议。SOAP(Simple Object Access Protocol,简单对象访问协议)是基于XML的消息传递协议,由于是基于XML,保证了不同系统的不同程序或组件之间,只要支持SOAP,都可以互相通信,更多SOAP规格的信息,请看W3C Web站点(http://www.w3.org/TR/soap)。如使用SOAP协议调用e13_2_1.asmx 中的Web服务方法,必须对调用的Web服务方法和方法参数用SOAP协议封装,实现比较复杂,.Net系统一般采用创建代理类的方法,因此不再介绍用SOAP封装的方法了,以后章节将详细介绍创建代理类的知识。
13.3.2 VS.Net建立Web服务客户端程序
Web服务客户端程序用SOAP协议调用远程的Web服务方法,Web服务客户端程序必须把程序的调用及其参数转化为SOAP协议,传送到Web服务。调用Web服务方法后,Web服务方法返回以XML表示的结果,还需要对XML文档进行解析,得到指定类型的数据。这些工作比较繁琐。程序员希望采用象普通编程语言调用一个方法那样调用Web服务方法,返回指定类型的数据。.Net系统采用创建代理类的方法实现这一目的。所谓代理,就是在客户端生成本地对象,作为远程Web服务方法的前端,该代理的功能是,Web服务客户端程序用一般程序语言那样调用Web服务方法,代理程序负责转换为SOAP协议,用SOAP协议调用Web服务方法,由代理程序负责获得Web服务方法返回的数据,由于这些数据也用SOPA协议表示,也要由代理程序转换为一般程序语言能够理解的数据类型,传送给Web服务客户端程序。
VS.Net工具提供了在Web服务客户端创建代理类的方法,客户端程序不必一定和Web服务在同一台计算机中,可以在任意一台Internet网中的计算机中。客户端程序可以是windows应用程序、ASP应用程序,也可以是另一个Web服务程序。下边以创建windows应用程序为例,介绍在Web服务客户端创建代理类的方法,具体步骤如下:
(1) 打开VS.Net,新建C#语言windows应用程序项目,项目命为e13_3_2,在窗体中增加一个按钮,标题为"调用Web服务",单击按钮将调用Web服务的Web方法,在窗体中增加2个文本框,用来输入两个加数。用3个Label控件作为提示信息,属性Text分别为:加数a、加数b、和。用一个Label控件显示调用Web服务的Web方法后返回的结果。设计界面如图13.3.2D。
(2) 建立Web服务客户端代理。单击VS.Net菜单"项目"|"添加Web引用"菜单项,弹出标题为"添加Web引用"的对话框如图13.3.2A。
图13.3.2A
(3)在对话框中的"地址(A) "栏中输入Web服务的URL,这个Web服务一般应在远程计算机中。本例Web服务和客户端在同一台计算机中,即是在13.2.2节中用VS.Net建立的Web服务,其URL为http://localhost/e13_2_2/Service1.asmx。不能使用例子e13_2_1建立的Web服务,因其不能自动创建WSDL文件。然后单击"地址(A)"栏右侧箭头图标,V S.Net自动查找指定URL的WSDL文件。见图13.3.2B。
图13.3.2B
(4) 单击标题为"添加引用"的按钮,在解决方案资源管理器中,可以看到一个新的"Web References"。见图13.3.2C。引用Service1采用如下格式:localhost.Service1。
(5) 为按钮增加事件函数如下,注意引用Service1的方法。
private void button1_Click(object sender, System.EventArgs e)
{ int x,y;
x=Convert.ToInt16(textBox1.Text);
y=Convert.ToInt16(textBox2.Text);
localhost.Service1 ws=
new localhost.Service1();
label4.Text=ws.MyWebMethod(x,y).ToString();
}
(6) 按F5,运行,输入2个加数,单击标题为"调用Web服务"按钮,显示和为30。
图13.3.2D 图13.3.2C
13.3.3 WSDL程序
.Net Framework的SDK提供了一个命令行程序WSDL.EXE,可以自动为Web服务客户端程序生成一个代理程序。下边介绍生成代理程序的具体方法。WSDL.EXE必须在控制台界面下使用,以生成例子e13_2_2中的Web服务的客户端代理类为例,使用的格式如下:
wsdl /l:C# /OUT:Service1.cs /protocol:soap http://localhost/e13_2_2/Service1.asmx?WSDL
其中,/l参数指定编制Web服务客户端程序使用的语言,可以是vb、C#和Jscript,默认值为C#;/OUT参数指定生成的代理类文件的路径和文件名,默认值和Web服务ASMX文件同名,扩展名为参数/l指定的语言的扩展名;参数/protocol指定调用Web服务方法使用的协议,可以是HTTP-GET、HTTP-POST和SOAP协议;http://后边是Web服务ASMX文件的URL。WSDL.exe是一个绿色软件,可以拷贝到任意位置运行。WSDL运行的结果是生成一个Web服务客户端程序代理类的源程序,可以用记事本程序查看其源代码。有了源程序,还要编译源程序生成dll文件,格式如下:csc /t:library Service1.cs,使用方法可参见1.2节。最终生成一个Service1.dll文件,使用它可以生成客户端代理类。
VS.Net也是使用WSDL.EXE为客户端程序增加代理程序。如果不使用VS.Net,只能直接使用WSDL.EXE生成客户端程序增加代理程序。
例子e13_3_3:控制台应用程序调用Web服务方法,源程序如下:
using System;
using System.Web.Services;
class UseService1
{
public static void Main()
{ string s;
int x,y,z;
Console.WriteLine("输入第1个加数a:");
s=Console.ReadLine();
x=Convert.ToInt(s);
Console.WriteLine("输入第2个加数b:");
s=Console.ReadLine();
y=Convert.ToInt(s);
Service1 ws=new Service1();//代理类对象
z=ws.MyWebMethod(x,y);//调用Web服务方法
Console.WriteLine("sum:={0}",z);
}
}
以文件名UseService1.cs存盘,和Service1.dll在同一文件夹,用下面的命令编译这段代码:csc /r:Service1.dll UseService1.cs,生成UseService1.exe,运行生成的UseService1.exe程序,输入两个加数后,在CRT上输出运算结果。
如用记事本生成调用Web服务的ASP.Net网页文件,要把生成的Service1.dll文件存到这个网页文件所在目录的子目录bin下,这个代理类就可以被这个ASP.Net网页使用了。请读者完成这个例子。
13.3.4 同步和异步Web服务
以上所介绍的客户端调用Web服务方法,要一直等待Web服务方法运行结束后,返回结果,才能执行其它程序,这种调用方法叫做同步模式Web服务调用。如果Web服务方法访问远程数据库、执行网络输入/输出和读写大文件,将花费大量时间执行这些操作,采用同步Web服务模式将会降低程序的运行效率,此时可使用Web服务异步调用模式。所谓异步模式Web服务调用是程序执行Web服务调用后,并不等待返回的结果,而是执行其它程序,一直到希望取回Web服务方法返回数据时,才取回数据分析。13.3.3节中生成的Service1.cs中有两个方法BeginMyWebMethod和EndMyWebMethod就是为了实现Web服务异步调用模式的,有兴趣的读者可参考有关文献深入学习。
13.3.5 不同系统Web服务的互操作
前面仅仅介绍了.Net系统Web服务的建立及使用,那么不同系统Web服务是否可以实现互操作呢?换句话讲,一个系统的客户端程序是否可以使用另一个系统的Web服务呢?答案应该是肯定的,但实现起来却很麻烦。这主要是各个系统实现的WSDL、Soap协议等细节还不完全相同,很多系统并不能自动生成代理程序,很多工作还必须由程序员自己实现。程序员首先要做的是把程序的调用及其参数转化为SOAP协议,用Http-Post协议发送给Web服务程序。其次调用Web服务方法后,Web服务方法返回以XML表示的结果,还需要对XML文档进行解析,得到指定类型的数据。很多公司提供了SOAP工具包来创建和分析SOAP消息。这些工具包通常将函数调用从某种语言转换为SOAP 消息。例如,Microsoft SOAP Toolkit 2.0 将 COM 函数调用转换为 SOAP,而 Apache Toolkit 将 JAVA 函数调用转换为 SOAP。函数调用的类型和支持的参数的数据类型随每个SOAP实现方案的不同而不同,因此适用于一个工具包的函数可能并不适用于另一个工具包。这并不是 SOAP 的限制,而是所使用的特定实现方案的限制。本课程就不介绍这方面的知识了,有兴趣的读者可参考有关文献,继续深入学习。
13.4 发布和发现Web服务
在Web服务中应包括三个角色:Web服务提供者、Web服务调用者、Web服务注册查询中心。他们之间的关系如下图。
完成Web服务开发,Web服务提供者为了让Web服务调用者找到自己的Web服务,必须到Web服务注册查询中心注册自己的Web服务。Web服务调用者只有到Web服务注册查询中心查询才能找到需要的Web服务。当然,并不是所有的Web服务应用都包括以上3部分,例如,上节所介绍的气象台、应用程序集成、工作流程解决方案等并不需要Web服务注册,而代码复用、新的销售方式则需要Web服务注册。作为程序员,学习的重点应在学习创建Web服务服务器端和客户端程序。本节简单介绍Web服务发布和查找问题。
图13.4
13.4.1 Web服务发布
和使用因特网上任何其他的资源一样,如果没有查找的方法,是不可能够找到一个特定的Web服务的。为了实现Web服务的注册和查找,微软、IBM和Ariba合作建立了一个带有UDDI(Universal Description 、Discovery and Integration,统一描述发现和集成规范)的网站:http://www.uddi.org/,可以让Web服务供应者在其上发布他们提供的Web服务的信息,而Web服务使用者可以在此网站查询所需的Web服务。
UDDI是一个独立于平台的、开放式的架构,可描述Web服务、发现服务,并提供一个可操作的注册表,允许Web服务提供者注册。现在已有几百家公司支持UDDI协议。
13.4.2 Web服务发现
程序设计者可以通过以下步骤发现所需的Web服务:
(1) 首先,访问Web服务目录网址,例如http://www.uddi.org/,查找所需Web服务,将返回一个所需Web服务URL。
(2) 按照返回URL,用如下格式访问这个网址:http:// 返回Web服务URL?discro。disco文件是包含连接到其它描述XML Web服务资源的XML文件。.Net的Web服务自动创建这个XML Web服务disco文件,读者可用如下语句访问web服务例子e13_2_2的disco文件:http://localhost/e13_2_2/Service1.asmx? disco。
(3) 使用Web服务的WSDL建立一个Web服务客户端程序代理类。
(4) 建立Web服务客户端程序,使用代理类访问Web服务方法。
13.5 使用Web服务的例子
本节介绍2个使用Web服务的实际例子,进一步介绍Web服务的使用。
13.5.1 .Net系统Web服务支持的数据类型
并不是所有数据类型都可以作为Web服务方法参数和返回值的数据类型,这是因为一种数据类型在不同的系统中,定义的格式可能不同,例如常见的int类型,在不同系统中位数可能不一致。为了解决这个问题,XML Schema Definition草案规定了Web服务应支持的数据类型及定义。主要包括基本类型:String、Char、Boolen、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal等,以及class、struct、DataSet、XmlNode、String[]、DataSet[]、XmlNode[]等等。.Net系统的Web服务支持以上数据类型。
13.5.2 使用Web服务返回数据库表
使用Web服务,经常要查询数据库中指定数据,一般这些数据为一个数据库表。由于Web服务不支持DataTable类对象作为参数或返回值数据类型,因此必须把DataTable类对象放到DataSet类对象中,作为返回值数据类型,下边是实现的例子。
例子e13_5_2A:本例创建Web服务器端的程序,其Web服务方法返回第8章创建的数据库StudentI中的Student表。使用VS.Net建立这个Web服务的具体步骤如下:
(1)创建asp.Net web服务项目,项目名为e13_5_2。
(2)按照8.12节的例子e8_12中的第(4)步到第(8)步创建OleDbConnection对象、OleDbDataAdapter对象和数据集DataSet对象。
(3)在构造函数Service1中增加语句如下:
dataSet11.Clear();
oleDbDataAdapter1.Fill(dataSet11);
(4) 为了在访问时不出现建议提示,在Service1类定义的前边加入如下语句:[WebService(Namespace="http://202.206.96.204/")]。
(5) 增加一个Web服务方法MyWebMethod如下:
[WebMethod]
public DataSet MyWebMethod ()
{ return dataSet11;
}
例子e13_5_2B:本例创建Web服务客户端的程序,单击按钮,调用例子e13_5_2中Web服务方法,将返回的使用数据库StudentI中的Student表在DataGrid控件中显示。用VS.Net建立Windows应用程序的具体步骤如下:
(1) 打开VS.Net,新建Windows应用程序项目,项目命为e13_5_2B,在窗体中增加一个按钮,标题为"调用Web服务",单击按钮将调用例子e13_5_2中的Web服务方法。增加一个DataGrid控件,用来显示调用Web服务方法后返回的数据库StudentI中的Student表。
(2) 按照例子e13_3_2的方法添加Web引用。
(3) 为按钮增加事件函数如下:
private void button1_Click(object sender, System.EventArgs e)
{ localhost.Service1 ws=new localhost.Service1();
DataSet ds=ws.MyWebMethod();
dataGrid1.DataSource=ds.Tables[0].DefaultView;
}
(4) 编译运行,单击标题为"调用Web服务"的按钮,将在DataGrid控件中显示数据库StudentI中的Student表。
13.5.3 用Web服务传送图形文件
本节介绍用Web服务传送图形文件的方法。基本思想是在服务器端把图形文件转换为一个字节数组,传递到客户端,再转换为图形文件,并显示,步骤如下:
例子e13_5_3:在服务器端的Web服务方法如下:
[WebMethod]
public byte[] GetImage()
{ string s=Server.MapPath("p1.GIF");
if(File.Exists(s))
{ FileStream fs=File.OpenRead(s);
int n;
MemoryStream fst=new MemoryStream();
while((n=fs.ReadByte())!=-1)
{ fst.WriteByte(((byte)n));
}
fs.Close();
return fst.ToArray();
}
else
{ return new byte[0];
}
}
例子e13_5_3B:在客户端建立Windows应用程序,按照例子e13_3_2的方法添加Web引用。增加一个按钮,标题为"调用Web服务",增加一个PictureBox控件用来显示所传递的图形文件。按钮单击事件函数如下:
private void button1_Click(object sender, System.EventArgs e)
{ localhost.Service1 ws=new localhost.Service1();
byte[] B1=ws.GetImage();
MemoryStream fst=new MemoryStream(B1,0,B1.Length);
Bitmap image=new Bitmap(fst);
pictureBox1.Image=image;
}
习题
(1) 请说出其它使用Web服务的例子。
(2) 修改例子e13_3_2为ASP.Net应用程序,此时,网页提供了一个界面,允许访问此网页的用户输入两个加数,单击计算按钮,调用另一台计算机中的Web服务方法计算两个加数的和。这时应在网页所在的计算机中生成代理类。(提示:要在两台计算机中完成)
(3) 修改例子e13_3_2,客户端程序也是一个Web服务,调用例子e13_2_2中的求和Web服务方法,请问如何实现。(提示:要在两台计算机中完成)
(4) 在Web服务中,也可以使用Application和Session对象,和ASP.Net中使用方法相同。修改例子e15_5_2,将DataSet对象放到Application中,供所有的Web服务使用。
(5) 修改例子e15_5_2,客户端程序提供一个Sql语句,Web服务方法根据此Sql语句查询指定数据,返回客户端。
(6) 完成例子e13_5_3。(提示:使用文件必须引入的命名空间using System.IO;)
(7) 例子e13_5_3读文件可能出错,如何处理。
19Web服务的更多相关文章
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 启动了VSAN服务的主机不在vCenter集群中
背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...
- node服务的监控预警系统架构
需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...
- 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇
什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...
- 本人提供微软系.NET技术顾问服务,欢迎企业咨询!
背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...
- 使用 Roslyn 编译器服务
.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...
- C#高性能TCP服务的多种实现方式
哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...
- 使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
随机推荐
- linux 忘记root(这里以centos 6.5为例)密码的解决办法
在使用linux的过程中有时候会忘记root用户的密码(尤其是进行交接而文档内容不全的时候),这个时候我们就可以进入单用户模式来重置root用户密码.下面来讲解重置root密码的方式,也可以说是破解r ...
- poj 3321(带时间戳 + 区间统计)
题目描述: 给定一颗树,求某个节点的子树的val值之和 可以用树的前序遍历给每一个节点编号,从而可以确定一个节点的子树的范围,这样就可以进行直接在区间上进行统计了. vector < int & ...
- P4475 巧克力王国(KDTree)
传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...
- 第四代增强 NEW BADI的定义及实现
NEW BADI 是在第四代增强框架下创建的BADI,是相对于第三代增强Classic Badi 而言的. 根据第四代增强的基本概念,所有显式增强Enhancement options 都必须放在增强 ...
- poj 2195 Going Home (km算法)
题目链接: http://poj.org/problem?id=2195 解题思路: 把man和home都提取出来,然后算出每个man和home的距离算出来,然后建立匹配图,套用km算法的模板,求最小 ...
- 配置Ubuntu16.04第02步:更改镜像源,更新系统
Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更新源(就是这些软件所在的服务器),一般直接百度Ubuntu更新源就能出来一大堆,这时候最好是找和自己 ...
- 转 Docker Swarm vs Kubernetes
容器化已经改变我们部署软件和微服务开发的方式.如果你刚听说容器, 这篇博客帮你入门. 什么是容器编排 容器能够把服务打包成基本单元,你可以把它部署到任何地方:本地机器.测试环境或者生产系统.但是在生产 ...
- 转 SQL*PLUS中的替换变量(& &&)
今天oracle support提供一个脚本,大致如下: PROMPT ROUTING_SEQUENCE_ID = &ROUT_SEQ_ID PROMPT OPERATION_SEQUENCE ...
- apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA)
不多说,直接上干货! Storm的版本选取 我这里,是选用apache-storm-1.0.2.tar.gz apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解) 为什么 ...
- framework7 点取消后还提交表单解决方案
$$('form.ajax-submit').on('submitted', function (e) { var xhr = e.detail.xhr; // actual XHR object v ...