引言  

  以前使用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页面,编写:

  1. namespace FirstWebservice
  2. {
  3. /// <summary>
  4. /// WebService1 的摘要说明
  5. /// </summary>
  6. [WebService(Namespace = "http://tempuri.org/")]
  7. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  8. [System.ComponentModel.ToolboxItem(false)]
  9. // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
  10. // [System.Web.Script.Services.ScriptService]
  11. public class WebService1 : System.Web.Services.WebService
  12. {
  13. [WebMethod(Description = "求和的方法")]
  14. public double addition(double i, double j)
  15. {
  16. return i + j;
  17. }
  18. [WebMethod(Description = "求差的方法")]
  19. public double subtract(double i, double j)
  20. {
  21. return i - j;
  22. }
  23. [WebMethod(Description = "求积的方法")]
  24. public double multiplication(double i, double j)
  25. {
  26. return i * j;
  27. }
  28. [WebMethod(Description = "求商的方法")]
  29. public double division(double i, double j)
  30. {
  31. if (j != )
  32. return i / j;
  33. else
  34. return ;
  35. }
  36. }
  37. }

至此创建了一个webservice,里面包含加减乘除4个方法。如下图显示:

Asp.net调用webservice:

下面创建一个asp.net项目调用webservice:

首先引用webservice,将服务的网站网址加入服务引用即可。添加服务引用界面如图:

编写调用的方法:

  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3. string selectFlag = selectOper.Value;
  4. ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient();
  5.  
  6. if (selectFlag.Equals("+"))
  7. {
  8. Result.Text = (web.addition(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
  9. }
  10. else if (selectFlag.Equals("-"))
  11. {
  12. Result.Text = (web.subtract(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
  13. }
  14. else if (selectFlag.Equals("*"))
  15. {
  16. Result.Text = (web.multiplication(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
  17. }
  18. else if (selectFlag.Equals("/"))
  19. {
  20. Result.Text = (web.division(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
  21. }
  22. }

在运行界面内,随即选择“-”号,最后得到的运算如下图:

Winform调用webservice:

既然上面在介绍webservice时说了其是夸平台的,那么创建一个winform系统调用webservice。同样先添加webservice,

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient();
  4. this.txt3.Text = (web.multiplication(double.Parse(this.txt1.Text), double.Parse(this.txt2.Text))).ToString();
  5. }

可以看出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协议格式如下:

  1. <?xml version="1.0"?>
  2. <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
  3. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  4.  
  5. <soap:Header>
  6. <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
  7. soap:mustUnderstand="">
  8. </m:Trans>
  9. </soap:Header>
  10.  
  11. <soap:Body>
  12. <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
  13. <m:Item>Apples</m:Item>
  14. </m:GetPrice>
  15. </soap:Body>
  16.  
  17. </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生成了相应的代理类供我们使用。

实例:

  1. public class Service : System.Web.Services.WebService
  2. {
  3. public Service () {
  4. }
  5.  
  6. [WebMethod]
  7. public DateTime HelloWorld(int i)
  8. {
  9. return DateTime.Now;
  10. }
  11. }

WSDL:

  1. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 <?xml version="1.0" encoding="utf-8"?>
  2. <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/">
  3. <wsdl:types>
  4. <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
  5. <s:element name="HelloWorld">
  6. <s:complexType>
  7. <s:sequence>
  8. <s:element minOccurs="" maxOccurs="" name="i" type="s:int" />
  9. </s:sequence>
  10. </s:complexType>
  11. </s:element>
  12. <s:element name="HelloWorldResponse">
  13. <s:complexType>
  14. <s:sequence>
  15. <s:element minOccurs="" maxOccurs="" name="HelloWorldResult" type="s:dateTime" />
  16. </s:sequence>
  17. </s:complexType>
  18. </s:element>
  19. </s:schema>
  20. </wsdl:types>
  21. <wsdl:message name="HelloWorldSoapIn">
  22. <wsdl:part name="parameters" element="tns:HelloWorld" />
  23. </wsdl:message>
  24. <wsdl:message name="HelloWorldSoapOut">
  25. <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
  26. </wsdl:message>
  27. <wsdl:portType name="ServiceSoap">
  28. <wsdl:operation name="HelloWorld">
  29. <wsdl:input message="tns:HelloWorldSoapIn" />
  30. <wsdl:output message="tns:HelloWorldSoapOut" />
  31. </wsdl:operation>
  32. </wsdl:portType>
  33. <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
  34. <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
  35. <wsdl:operation name="HelloWorld">
  36. <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
  37. <wsdl:input>
  38. <soap:body use="literal" />
  39. </wsdl:input>
  40. <wsdl:output>
  41. <soap:body use="literal" />
  42. </wsdl:output>
  43. </wsdl:operation>
  44. </wsdl:binding>
  45. <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
  46. <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
  47. <wsdl:operation name="HelloWorld">
  48. <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
  49. <wsdl:input>
  50. <soap12:body use="literal" />
  51. </wsdl:input>
  52. <wsdl:output>
  53. <soap12:body use="literal" />
  54. </wsdl:output>
  55. </wsdl:operation>
  56. </wsdl:binding>
  57. <wsdl:service name="Service">
  58. <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
  59. <soap:address location="http://localhost:2206/WebSite1/Service.asmx" />
  60. </wsdl:port>
  61. <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12">
  62. <soap12:address location="http://localhost:2206/WebSite1/Service.asmx" />
  63. </wsdl:port>
  64. </wsdl:service>
  65. </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可以完成这一功能。

引用:

SOAP和WSDL的一些必要知识

SOAP消息机制简介

Webservice服务创建、调用笔记的更多相关文章

  1. C#调用WebService服务(动态调用)

    原文:C#调用WebService服务(动态调用) 1 创建WebService using System; using System.Web.Services; namespace WebServi ...

  2. WebService-01-使用jdk发布第一个WebService服务并调用

    Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...

  3. soamanager发布的Webservice服务,调用时出现http500报错

    最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...

  4. Java创建WebService服务及客户端实现(转)

    简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto. ...

  5. Java创建WebService服务及客户端实现

    简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto. ...

  6. 使用 webservice 实现 RPC 调用

    WebService 介绍 Web service 是一个平台独立的,低耦合的 web 的应用程序用于开发分布式的互操作的应用程序.Web Service 技术, 能使得运行在不同机器上的不同应用无须 ...

  7. 使用apache cxf实现webservice服务

    1.在idea中使用maven新建web工程并引入spring mvc,具体可以参考https://www.cnblogs.com/laoxia/p/9311442.html; 2.在工程POM文件中 ...

  8. Spring Boot 开发 WebService 服务

    WebService 虽然现在大部分互联网企业不太提倡使用,但在以第三方接口为主导的市场,对方来什么接口你还得用什么接口,不可能把接口重写了.例如大部分传统的大型企业都在用 WebService,并且 ...

  9. Axis2创建WebService服务端接口+SoupUI以及Client端demo测试调用

    第一步:引入axis2相关jar包,如果是pom项目,直接在pom文件中引入依赖就好 <dependency> <groupId>org.apache.axis2</gr ...

随机推荐

  1. 在注册表中无Python3.5安装路径的情况下安装pywin32-

    当安装pywin32出现Python Version 3.5 required which was not found in the registry的时候表面注册表中没有Python3.5的安装路径 ...

  2. Pyqt adb 获取Android手机屏幕

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...

  3. MySQL - 常用命令及常用查询SQL

    常用查询SQL #查看临时目录 SHOW VARIABLES LIKE '%tmp%'; #查看当前版本 SELECT VERSION(); 常用命令 #查看当前版本,终端下未进入mysql mysq ...

  4. MySQL 分组后,统计记录条数

    分组后,统计记录条数: SELECT num,count(*) AS counts from test_a GROUP BY num; 查询结果如下: 对num去重后的数量的统计: SELECT co ...

  5. iOS 开发技巧收藏贴 链接整理

    54个技巧 57个技巧 正则表达式

  6. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  7. windows 安装MySql

    转载:http://blog.csdn.net/longyuhome/article/details/7913375 Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系 ...

  8. *HDU1142 最短路+记忆化dfs

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  9. Django入门2

    Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Django自带的模板来学习(显示一 ...

  10. 无聊拆中国银行密码器和农业银行U盾

    原始状态 不知从何下手,直接斜口钳暴力剪开 开始露出电路板了,继续拆 拆完是这样的,屏幕没有焊接,直接靠外壳压上去的 背面图 相对而言,农行的就很好拆 后盖很好撬开 前面就是按键,没什么,屏是1286 ...