引言
以前使用windows服务,于是学习并记录下来:windows服务的创建、安装、调试全过程及引发的后续学习。现如今需要用到webservice,对此感觉到很困惑。经过几天的学习、查阅资料,终于大致搞清如何运用,至于它的根本原理,暂时还不能完全理解,以后有机会再详细研究吧。
定义:
webservice是一个平台独立的,低耦合,自包含的、基于可编程可编程的应用程序,可使用开放的xml标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。(百度定义)
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如的xml、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
个人理解:webservice是一个独立的平台,是用xml来描述的,可以帮组不同平台下的系统建立数据交互机制。比如:在一个很庞大的asp.net网站上创建一个webservice,公司内部的其他部门开发的系统需要引用网站的一些数据,那么在网站上面创建一个webservice,其他系统直接添加web服务即可调用网站上的一个数据或者是方法等等。
创建一个简单的webservice:
讲述碰到的第一个小问题:本人使用的visual studio2010,在新建项目时找不到web服务?
直接选择.net4.0,可以选择创建asp.net空模板,然后添加新项选择web服务模板即可。此方法最简单。还有:选择.net2.0,,3.0,3.5,就可以选择webservice模板了,之后需要.net4.0新特性,在项目属性窗口或者页窗口的Build选项卡中选择.net4.0即可。
新建一个空的asp.net项目,添加webservice页面,编写:
namespace FirstWebservice { /// <summary> /// WebService1 的摘要说明 /// </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 WebService1 : System.Web.Services.WebService { [WebMethod(Description = "求和的方法")] public double addition(double i, double j) { return i + j; } [WebMethod(Description = "求差的方法")] public double subtract(double i, double j) { return i - j; } [WebMethod(Description = "求积的方法")] public double multiplication(double i, double j) { return i * j; } [WebMethod(Description = "求商的方法")] public double division(double i, double j) { if (j != 0) return i / j; else return 0; } } }
至此创建了一个webservice,里面包含加减乘除4个方法。如下图显示:
Asp.net调用webservice:
下面创建一个asp.net项目调用webservice:
首先引用webservice,将服务的网站网址加入服务引用即可。添加服务引用界面如图:
编写调用的方法:
protected void Button1_Click(object sender, EventArgs e) { string selectFlag = selectOper.Value; ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient(); if (selectFlag.Equals("+")) { Result.Text = (web.addition(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString(); } else if (selectFlag.Equals("-")) { Result.Text = (web.subtract(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString(); } else if (selectFlag.Equals("*")) { Result.Text = (web.multiplication(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString(); } else if (selectFlag.Equals("/")) { Result.Text = (web.division(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString(); } }
在运行界面内,随即选择“-”号,最后得到的运算如下图:
Winform调用webservice:
既然上面在介绍webservice时说了其是夸平台的,那么创建一个winform系统调用webservice。同样先添加webservice,
private void button1_Click(object sender, EventArgs e) { ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient(); this.txt3.Text = (web.multiplication(double.Parse(this.txt1.Text), double.Parse(this.txt2.Text))).ToString(); }
可以看出winform的调用和asp.net调用基本是相同的。在此也就没有一一验证,只是简单的选择“*”作为运算符,运行结果如下:
总结:
上文简单描述了webservice的基本认识,接着创建了一个相当简单的webservice,然后创建一个asp.net项目和winform系统对它进行调用,所有一切基本上完成了webservice的使用过程。大家平时看到的更高级的webservice,或者可以说是更为复杂的webservice吧,这些都是在最简单的webservice基础上增加的一些很复杂的业务逻辑,抽丝剥茧后还是基本的webservice应用。
补充:
webservice三要素:SOAP(simple object access protocol),WSDL(web service description language),UDDI(universal description discovery and integration).
- Web Service实现业务诉求:Web Service是真正“办事”的那个。
- SOAP提供“请求”的规范:你想让人家办事,总得告诉人家你想干什么吧,SOAP就是定义这个“请求”的格式的,按照SOAP定义的“请求”格式“书写”请求就可以保证Web Service能够正确的解读你想让它干什么以及你为它提供了什么参数。在这个请求中,你需要描述的主要问题有:向哪个Web Service发送请求,请求的参数类型、参数值、返回值类型。这些都“填写”完毕,也就完成了符合SOAP规范的SOAP消息。
- WSDL提供“能办的事的说明”:我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型。
SOAP简单对象访问协议是在分散或分布式的环境中传递信息的一个基于xml的协议。标准的soap协议格式如下:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234 </m:Trans> </soap:Header> <soap:Body> <m:GetPrice xmlns:m="http://www.w3schools.com/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> </soap:Envelope>
下面解释里面的元素:
a) Envelope
SOAP的请求内容必须以Envelope做为根节点。
xmlns:soap="http://www.w3.org/2001/12/soap-envelope",不能修改,否则会出错。http://www.w3.org/2001/12/soap-envelope里面有Envelope的schema的相关定义。有兴趣的可以去这个链接的内容。
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding",这个指定了数据元素的类型。
b) Header
这个是可选的,如果需要添加Header元素,那么它必须是Envelope的第一个元素。
Header的内容并没有严格的限制,我们可以自己添加一些和应用程序相关的内容,但是客户端一定要记得处理这些Header元素,可以加上mustUnderstand强制进行处理。
c) Body
这个就是请求的主题内容了,请求什么函数,参数是什么类型等等都在这里面指定。
用标签表示一个函数,然后用子元素表示它的参数。
在调用中没有指定参数和返回类型,这里不需要指定,因为提供服务的一方自己已经规定好了数据类型,在调用时指定数据类型没有任何意义。
WSDL是用来描述WebService的,它用XML的格式描述了WebService有哪些方法、参数类型、访问路径等等。我们要使用一个WebService肯定首先要获取它的WSDL,在VS中添加一个Web 引用时,这些工作由开发环境帮我们做了,开发环境根据WSDL文档给Web Service生成了相应的代理类供我们使用。
实例:
public class Service : System.Web.Services.WebService { public Service () { } [WebMethod] public DateTime HelloWorld(int i) { return DateTime.Now; } }
WSDL:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="HelloWorld"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="i" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="HelloWorldResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="HelloWorldResult" type="s:dateTime" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="HelloWorldSoapIn"> <wsdl:part name="parameters" element="tns:HelloWorld" /> </wsdl:message> <wsdl:message name="HelloWorldSoapOut"> <wsdl:part name="parameters" element="tns:HelloWorldResponse" /> </wsdl:message> <wsdl:portType name="ServiceSoap"> <wsdl:operation name="HelloWorld"> <wsdl:input message="tns:HelloWorldSoapIn" /> <wsdl:output message="tns:HelloWorldSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="HelloWorld"> <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="HelloWorld"> <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> <wsdl:input> <soap12:body use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Service"> <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap"> <soap:address location="http://localhost:2206/WebSite1/Service.asmx" /> </wsdl:port> <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12"> <soap12:address location="http://localhost:2206/WebSite1/Service.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
一个WSDL文档由四部分组成:
1、types
指定了WebService用到的所有数据类型,上面用到了两种数据类型,int和datetime
2、message
指明一个操作所用到的数据类型。
HelloWorldSoapIn是指HelloWorld的输入操作用到的数据类型,HelloWorldSoapOut是指HelloWorld的输出操作用到的数据类型。二者的element元素指出了与types中对应到的具体类型。
3、portType
指出了这个WebService所有支持的操作,就是说有哪些方法可供调用。
这里支持一个HelloWorld调用,它的输入和输出对应到HelloWorldSoapIn和HelloWorldSoapOut这个两个数据类型。
4、binding
soap12:binding元素的transport指明传输协议,这里是http协议。
operation 指明要暴露给外界调用的操作。
use属性指定输入输出的编码方式,这里没有指定编码。
5、services
指定服务的一些信息,主要是指定服务的访问路径。
UDDI(统一描述发现和集成) 提供一种发布和查找服务描述的方法。UDDI 数据实体提供对定义业务和服务信息的支持。WSDL 中定义的服务描述信息是UDDI注册中心信息的补充。客户端通过UDDI的标准和机制来搜寻需要的web服务,绑定找到的web服务并使用它提供的服务。另外,框架为企业进一步发展电子商务提供了接口,建立在UDDI基础上的Web services可以完成这一功能。
引用: