Web Service
去年新入职时,接触过一点 WCF,也知道 Web Service 的存在,目前刚好在做一个 Web Service 相关的东西,借此机会,学习一下 Web Service。
概念初识
首先就要了解什么是 Web Service,Web Service 能用来做什么?具体信息可参见:Web Service 入门;
目前 Web Service 并没有明确的定义,推荐维基百科
Web Service 是一种面向服务的架构技术,通过标准的 Web 协议提供服务,保证不同平台(不同语言)间的应用服务可以互操作
- 提供服务接口
- 数据交换
作为面向服务架构的一种实现方式,以一种平台无关的方式在不同系统之间进行交互,
(XML) Web Service,既不是框架、也不是技术,严格来说是行业规范,通过 Internet 基于 SOAP 协议 在 Web 上提供软件服务,使用 WSDL 文件进行说明,并通过 UDDI 进行注册以供用户查找使用。Web Service 是构造分布式、模块化应用程序和面向服务应用集成的技术,利用网络进行应用集成的解决方案。Web Service 使用开放的 XML 文档来描述、发布、配置、开发分布式互操作的应用程序。
SOAP + WSDL + UDDI 是一个 Web Service 必不可少的部分,解释如下:
- SOAP:Simple Object Access Protocol,简易对象访问协议,一个基于 XML 的可扩展消息信封格式,Web Service 的通信协议
- WSDL:Web Services Description Language,Web Service 使用说明, 一个 XML 格式文档,用以描述服务端口访问方式和使用协议的细节,指导如何调用 Web Service
- UDDI:Universal Description, Discovery, and Integration,一个用来发布和搜索 Web 服务的协议,应用程序可借由此协议在设计或运行时找到目标 Web Service
服务提供方定义由 WSDL 描述的接口,并使用 SOAP 消息与服务使用方进行消息交互。
SOAP协议 = HTTP协议 + XML数据格式
Web Service 采用 HTTP 协议传输数据,采用 XML 格式封装数据,SOAP协议基于HTTP协议。
优点
- 平台独立、低耦合、自包含,基于可编程的Web应用程序
- 支持分布式部署
- 单向通信的方式(单工)、请求响应的方式(半双工)
- 应用程序之间只能以基于HTTP无状态的方式进行通信,寄宿于web服务器
基础使用
对 Web Service 的使用,包括如下三种方式
[1]. 远端过程调用:传统方式,RPC,提供一个分布式函数或方法接口供用户调用
[2]. 面向服务架构:SOA,连接服务 + 调用服务提供的方法
[3]. REST式服务:表达性状态转移,类似于HTTP协议,通过 Web Service 或 WCF 向外提供 REST 的 Service(restful 接口)
关于使用 JSON 和 XML 的问题
JSON 和 XML 两者都是 Web Service 的资源表示方式,用于发送请求和返回结果。
- JSON:轻量级的数据交换格式,良好的可读性和兼容性、编写快捷
- XML:扩展标记语言,非常适合 Web 传输
两者的优缺点
- 可读性、可扩展性等同
- 数据大小:JSON 要优于 XML,但是差别不大
- 性能测试:JSON 的解析速度几乎是 XML 解析的10倍
- 使用范围:XML 目前被业界广泛采用,而 JavaScript 语言对 JSON 支持要比 XML 优越
对于 Web Service 和 Rest Service,可参见:关于Web Service和Rest Service理解;
[1]. 提供服务
简单起见,新建一个服务 SqhWebService,提供一个两数相加的方法,基本步骤如下
(1)新建项目 ASP.NET 空 Web 应用程序,命名为 SqhWebService,然后添加 Web 服务,命名为 SqhWebService.asmx,结果为
(2)在服务文件 SqhWebService.asmx 中,添加两数相加的方法
namespace SqhWebService { /// <summary> /// SqhWebService 的摘要说明 /// </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 SqhWebService : System.Web.Services.WebService { [WebMethod] public int AddTwoInteger(int a, int b) { return a + b; } } }
(3)右键 SqhWebService.asmx,点击 在浏览器中查看,服务启动成功
同时,记录下服务的 URL 地址:http://localhost:20378/SqhWebService.asmx,备用。
[2]. 调用服务
对于服务调用,此处提供 2 种方法:
(1)直接点击上图中的 AddTwoInteger 方法,即可调用服务方法进行测试
然后,a = 1, b = 2, 点击调用,会得到如下结果
<?xml version="1.0" encoding="UTF-8"?> <int xmlns="http://tempuri.org/">3</int>
之后,解析该 xml 信息即可。
(2)新建一个 ASP.NET 程序或者控制台程序,关键是 添加服务引用
在弹出的界面中,添加刚刚记下来的 URL 地址,点击前往确认即可,下方的命名空间可以为 SqhServiceReference
下图给出引用添加后,项目方案资源的结构图
下面直接给出主程序中的调用代码
namespace TestWebService { public class Program { public static void Main(string[] args) { SqhServiceReference.SqhWebServiceSoapClient client = new SqhServiceReference.SqhWebServiceSoapClient(); int result = client.AddTwoInteger(1, 2); } } }
问题解决
[1]. 如何实现浏览器对WebService的远程调用?
以上创建的在浏览器调用的web服务仅供本地计算机调试使用,需要配置 web.config 才能实现远程调用调试
<system.web> <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices> <system.web>
如不配置,远程调用会出现:测试窗体只能用于来自本地计算机的请求解决 的问题。
[2]. 无法加载协定为“ServiceReference1.xxxxxx”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
原因:在 web.config 文件中多次引用了“添加外部引用”
解决方法:删除多余的 basicHttpBinding 绑定节点和 endpoint 终点节点,保持唯一性
项目配置文件 web.config 应该是如下形式: