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 应该是如下形式:

原文地址:https://www.cnblogs.com/wjcx-sqh/p/6933473.html