网络服务 - 快速指南


什么是网络服务?

不同的书籍和不同的组织对 Web 服务提供了不同的定义。这里列出了其中一些。

  • Web 服务是任何可以通过互联网使用并使用标准化 XML 消息传递系统的软件。XML 用于对与 Web 服务的所有通信进行编码。例如,客户端通过发送 XML 消息来调用 Web 服务,然后等待相应的 XML 响应。由于所有通信均采用 XML 格式,因此 Web 服务不依赖于任何一种操作系统或编程语言 — Java 可以与 Perl 通信;Windows 应用程序可以与 Unix 应用程序通信。

  • Web 服务是独立的、模块化的、分布式的动态应用程序,可以通过网络进行描述、发布、定位或调用,以创建产品、流程和供应链。这些应用程序可以是本地的、分布式的或基于网络的。Web 服务构建在 TCP/IP、HTTP、Java、HTML 和 XML 等开放标准之上。

  • Web 服务是基于 XML 的信息交换系统,它使用 Internet 进行直接应用程序到应用程序的交互。这些系统可以包括程序、对象、消息或文档。

  • Web 服务是用于在应用程序或系统之间交换数据的开放协议和标准的集合。用各种编程语言编写并在各种平台上运行的软件应用程序可以使用 Web 服务通过计算机网络(例如 Internet)交换数据,其方式类似于单个计算机上的进程间通信。这种互操作性(例如,Java 和 Python 之间,或 Windows 和 Linux 应用程序之间)是由于开放标准的使用。

总而言之,完整的网络服务是指任何满足以下条件的服务:

  • 可通过互联网或专用(内联网)网络使用

  • 使用标准化 XML 消息传递系统

  • 不依赖于任何一种操作系统或编程语言

  • 通过通用 XML 语法进行自描述

  • 可通过简单的查找机制发现

Web 服务的组件

基本的Web服务平台是XML+HTTP。所有标准网络服务都使用以下组件工作 -

  • SOAP(简单对象访问协议)

  • UDDI(通用描述、发现和集成)

  • WSDL(Web 服务描述语言)

所有这些组件都已在“Web 服务体系结构”一章中进行了讨论。

Web 服务如何工作?

Web 服务通过使用 HTML、XML、WSDL 和 SOAP 等开放标准实现各种应用程序之间的通信。网络服务需要以下帮助 -

  • XML 来标记数据

  • SOAP 传输消息

  • WSDL 描述服务的可用性。

您可以在 Solaris 上构建基于 Java 的 Web 服务,可以通过在 Windows 上运行的 Visual Basic 程序访问该服务。

您还可以使用 C# 在 Windows 上构建新的 Web 服务,这些服务可以从基于 JavaServer Pages (JSP) 并在 Linux 上运行的 Web 应用程序调用。

例子

考虑一个简单的帐户管理和订单处理系统。会计人员使用用 Visual Basic 或 JSP 构建的客户端应用程序来创建新帐户并输入新的客户订单。

该系统的处理逻辑是用Java编写的,驻留在Solaris机器上,该机器还与数据库交互以存储信息。

执行此操作的步骤如下 -

  • 客户端程序将帐户注册信息捆绑到SOAP消息中。

  • 该 SOAP 消息作为 HTTP POST 请求的正文发送到 Web 服务。

  • Web 服务解包 SOAP 请求并将其转换为应用程序可以理解的命令。

  • 应用程序根据需要处理信息,并用该客户的新的唯一帐号进行响应。

  • 接下来,Web 服务将响应打包到另一个 SOAP 消息中,并将该消息发送回客户端程序以响应其 HTTP 请求。

  • 客户端程序解包SOAP消息以获得帐户注册过程的结果。

为什么选择网络服务?

以下是使用网络服务的好处 -

在网络上公开现有功能

Web 服务是可以使用 HTTP 远程调用的托管代码单元。也就是说,可以使用 HTTP 请求来激活它。Web 服务允许您通过网络公开现有代码的功能。一旦它暴露在网络上,其他应用程序就可以使用您的程序的功能。

互操作性

Web 服务允许各种应用程序相互通信并共享数据和服务。其他应用程序也可以使用 Web 服务。例如,VB 或 .NET 应用程序可以与 Java Web 服务通信,反之亦然。Web服务用于使应用程序平台和技术独立。

标准化协议

Web 服务使用标准化的行业标准协议进行通信。所有四个层(服务传输层、XML 消息传递层、服务描述层和服务发现层)都使用 Web 服务协议栈中定义良好的协议。这种协议栈的标准化给企业带来了许多优势,例如广泛的选择、降低竞争成本以及提高质量。

低成本通讯

Web 服务使用 SOAP over HTTP 协议,因此您可以使用现有的低成本 Internet 来实现 Web 服务。与 EDI/B2B 等专有解决方案相比,该解决方案的成本要低得多。除了基于 HTTP 的 SOAP 之外,Web 服务还可以在其他可靠的传输机制(例如 FTP)上实现。

网络服务 - 特征

Web 服务具有以下特殊的Behave特征 -

基于XML

Web 服务在数据表示和数据传输层使用 XML。使用 XML 消除了任何网络、操作系统或平台绑定。基于 Web 服务的应用程序在其核心级别具有高度的互操作性。

松耦合

Web 服务的使用者并不直接与该 Web 服务绑定。Web 服务接口可以随着时间的推移而改变,而不会影响客户端与服务交互的能力。紧密耦合的系统意味着客户端和服务器逻辑彼此紧密相连,这意味着如果一个接口发生更改,则必须更新另一个接口。采用松散耦合的架构往往会使软件系统更易于管理,并允许不同系统之间更简单的集成。

粗粒度

面向对象的技术(例如 Java)通过单独的方法公开其服务。单个方法的操作过于精细,无法在公司级别提供任何有用的功能。从头开始构建 Java 程序需要创建几个细粒度的方法,然后将这些方法组合成一个粗粒度的服务,供客户端或其他服务使用。

业务及其公开的接口应该是粗粒度的。Web 服务技术提供了一种定义访问适量业务逻辑的粗粒度服务的自然方法。

同步或异步的能力

同步性是指客户端与服务执行的绑定。在同步调用中,客户端会阻塞并等待服务完成其操作,然后再继续。异步操作允许客户端调用服务,然后执行其他功能。

异步客户端在稍后的时间点检索其结果,而同步客户端在服务完成时接收其结果。异步能力是实现松耦合系统的关键因素。

支持远程过程调用(RPC)

Web 服务允许客户端使用基于 XML 的协议调用远程对象上的过程、函数和方法。远程过程公开 Web 服务必须支持的输入和输出参数。

在过去几年中,通过 Enterprise JavaBeans (EJB) 和 .NET 组件进行组件开发已日益成为体系结构和企业部署的一部分。这两种技术都是分布式的,并且可以通过各种 RPC 机制进行访问。

Web 服务通过提供自己的服务(相当于传统组件的服务)或通过将传入的调用转换为 EJB 或 .NET 组件的调用来支持 RPC。

支持文档交换

XML 的主要优点之一是它不仅可以表示数据,还可以表示复杂文档的通用方式。这些文档可以像代表当前地址一样简单,也可以像代表整本书或报价请求 (RFQ) 一样复杂。Web服务支持透明的文档交换,以促进业务集成。

Web 服务 - 架构

有两种查看 Web 服务架构的方法 -

  • 第一个是检查每个 Web 服务参与者的单独角色。
  • 第二是考察新兴的Web服务协议栈。

Web 服务角色

Web 服务架构中有三个主要角色 -

服务提供者

这是网络服务的提供商。服务提供商实施服务并使其在互联网上可用。

服务请求者

这是网络服务的任何消费者。请求者通过打开网络连接并发送 XML 请求来利用现有的 Web 服务。

服务注册中心

这是逻辑上集中的服务目录。注册表提供了一个中心位置,开发人员可以在其中发布新服务或查找现有服务。因此,它充当公司及其服务的集中清算所。

Web服务协议栈

查看 Web 服务架构的第二个选项是检查新兴的 Web 服务协议栈。该堆栈仍在不断发展,但目前有四个主要层。

服务运输

该层负责在应用程序之间传输消息。目前,该层包括超文本传输​​协议 (HTTP)、简单邮件传输协议 (SMTP)、文件传输协议 (FTP) 和较新的协议,例如块可扩展交换协议 (BEEP)。

XML消息传递

该层负责以通用 XML 格式对消息进行编码,以便两端都能理解消息。目前,该层包括XML-RPC和SOAP。

服务说明

该层负责描述特定 Web 服务的公共接口。目前,服务描述是通过 Web 服务描述语言 (WSDL) 处理的。

服务发现

该层负责将服务集中到公共注册表中并提供简单的发布/查找功能。目前,服务发现是通过通用描述、发现和集成(UDDI)来处理的。

随着 Web 服务的发展,可能会添加额外的层,并且可能会向每一层添加额外的技术。

下一章解释 Web 服务的组件。

关于服务运输的几句话

Web服务协议栈的最底层是服务传输。该层负责在两台计算机之间实际传输 XML 消息。

超文本传输​​协议 (HTTP)

目前,HTTP 是最流行的服务传输选项。HTTP 简单、稳定且部署广泛。此外,大多数防火墙允许 HTTP 流量。这允许 XMLRPC 或 SOAP 消息伪装成 HTTP 消息。如果您想要集成远程应用程序,这很好,但它确实引起了许多安全问题。

阻止可扩展交换协议 (BEEP)

这是 HTTP 的一个有前途的替代方案。BEEP 是一个新的互联网工程任务组 (IETF) 框架,用于构建新协议。BEEP 直接分层在 TCP 上,包含许多内置功能,包括初始握手协议、身份验证、安全性和错误处理。使用 BEEP,人们可以为各种应用程序创建新协议,包括即时消息传递、文件传输、内容联合和网络管理。

SOAP 不依赖于任何特定的传输协议。事实上,您可以通过 HTTP、SMTP 或 FTP 使用 SOAP。因此,一个有前途的想法是使用 SOAP 而不是 BEEP。

Web 服务 - 组件

在过去几年中,三项主要技术已成为全球标准,构成了当今 Web 服务技术的核心。下面讨论这些技术。

XML-RPC

这是用于在计算机之间交换信息的最简单的基于 XML 的协议。

  • XML-RPC 是一种使用 XML 消息执行 RPC 的简单协议。

  • 请求以 XML 编码并通过 HTTP POST 发送。

  • XML 响应嵌入在 HTTP 响应的正文中。

  • XML-RPC 是独立于平台的。

  • XML-RPC 允许不同的应用程序进行通信。

  • Java 客户端可以与 Perl 服务器进行 XML-RPC 对话。

  • XML-RPC 是开始使用 Web 服务的最简单方法。

要了解有关 XML-RPC 的更多信息,请访问我们的XML-RPC 教程

肥皂

SOAP 是一种基于 XML 的协议,用于在计算机之间交换信息。

  • SOAP 是一种通信协议。

  • SOAP 用于应用程序之间的通信。

  • SOAP 是一种发送消息的格式。

  • SOAP 旨在通过 Internet 进行通信。

  • SOAP 是独立于平台的。

  • SOAP 与语言无关。

  • SOAP 简单且可扩展。

  • SOAP 允许您绕过防火墙。

  • SOAP 将被开发为 W3C 标准。

要了解有关 SOAP 的更多信息,请访问我们的SOAP 教程

WSDL

WSDL 是一种基于 XML 的语言,用于描述 Web 服务以及如何访问它们。

  • WSDL 代表 Web 服务描述语言。

  • WSDL 由 Microsoft 和 IBM 联合开发。

  • WSDL 是一种基于 XML 的协议,用于在分散和分布式环境中进行信息交换。

  • WSDL 是描述 Web 服务的标准格式。

  • WSDL 定义描述了如何访问 Web 服务以及它将执行哪些操作。

  • WSDL 是一种用于描述如何与基于 XML 的服务进行交互的语言。

  • WSDL 是 UDDI 的一个组成部分,UDDI 是一个基于 XML 的全球商业注册中心。

  • WSDL 是 UDDI 使用的语言。

  • WSDL 发音为“wiz-dull”,拼写为“WSDL”。

要了解有关 WSDL 的更多信息,请访问我们的WSDL 教程

UDDI

UDDI 是一种基于 XML 的标准,用于描述、发布和查找 Web 服务。

  • UDDI 代表通用描述、发现和集成。

  • UDDI 是 Web 服务的分布式注册规范。

  • UDDI 是独立于平台的开放框架。

  • UDDI 可以通过 SOAP、CORBA 和 Java RMI 协议进行通信。

  • UDDI 使用 WSDL 来描述 Web 服务的接口。

  • UDDI 与 SOAP 和 WSDL 一起被视为 Web 服务的三大基础标准之一。

  • UDDI 是一项开放的行业计划,使企业能够发现彼此并定义它们如何通过 Internet 进行交互。

要了解有关 UDDI 的更多信息,请访问我们的UDDI 教程

Web 服务 - 示例

基于 Web 服务架构,我们创建以下两个组件作为 Web 服务实现的一部分 -

服务提供商或出版商

这是网络服务的提供商。服务提供商实施服务并使其在 Internet 或 Intranet 上可用。

我们将使用 .NET SDK 编写并发布一个简单的 Web 服务。

服务请求者或消费者

这是网络服务的任何消费者。请求者通过打开网络连接并发送 XML 请求来利用现有的 Web 服务。

我们还将编写两个 Web 服务请求程序:一个基于 Web 的使用者(ASP.NET 应用程序)和另一个基于 Windows 应用程序的使用者。

下面给出的是我们的第一个 Web 服务示例,它作为服务提供者工作,并公开两个方法(add 和 SayHello)作为应用程序使用的 Web 服务。这是 Web 服务的标准模板。.NET Web 服务使用 .asmx 扩​​展名。请注意,公开为 Web 服务的方法具有 WebMethod 属性。将此文件另存为 IIS 虚拟目录中的 FirstService.asmx(如配置 IIS 中所述;例如,c:\MyWebSerces)。

FirstService.asmx
<%@ WebService language = "C#" class = "FirstService" %>

using System;
using System.Web.Services;
using System.Xml.Serialization;

[WebService(Namespace = "http://localhost/MyWebServices/")]
public class FirstService : WebService{
   [WebMethod]
   public int Add(int a, int b) {
      return a + b;
   }

   [WebMethod]
   public String SayHello() {
      return "Hello World";
   }
}

要测试 Web 服务,必须将其发布。Web 服务可以发布到 Intranet 或 Internet 上。我们将在本地计算机上运行的 IIS 上发布此 Web 服务。让我们从配置 IIS 开始。

  • 打开开始 → 设置 → 控制面板 → 管理工具 → Internet 服务管理器。

  • 展开并右键单击默认网站;选择新建&#rarr; 虚拟目录。虚拟目录创建向导打开。点击下一步。

  • “虚拟目录别名”屏幕打开。输入虚拟目录名称。例如,MyWebServices。点击下一步。

  • “网站内容目录”屏幕打开。

  • 输入虚拟目录的目录路径名。例如,c:\MyWebServices。点击下一步。

  • “访问权限”屏幕打开。根据您的要求更改设置。让我们保留本练习的默认设置。

  • 单击下一步按钮。这样就完成了IIS的配置。

  • 单击“完成”完成配置。

要测试 IIS 是否已正确配置,请在上面创建的虚拟目录 (C:\MyWebServices) 中复制 HTML 文件(例如 x.html)。现在,打开 Internet Explorer 并输入http://localhost/MyWebServices/x.html。它应该打开 x.html 文件。

注意- 如果不起作用,请尝试将 localhost 替换为您计算机的 IP 地址。如果还是不行,检查IIS是否正在运行;您可能需要重新配置 IIS 和虚拟目录。

要测试此 Web 服务,请将 FirstService.asmx 复制到上面创建的 IIS 虚拟目录 (C:\MyWebServices) 中。在 Internet Explorer 中打开 Web 服务 (http://localhost/MyWebServices/FirstService.asmx)。它应该打开您的网络服务页面。该页面应该包含指向我们的应用程序公开为 Web 服务的两个方法的链接。恭喜!您已经编写了您的第一个 Web 服务!

测试网络服务

正如我们刚刚看到的,在 .NET Framework 中编写 Web 服务非常容易。在 .NET 框架中编写 Web 服务消费者也很容易;然而,它涉及更多一些。如前所述,我们将编写两种类型的服务消费者,一种是基于 Web 的消费者,另一种是基于 Windows 应用程序的消费者。让我们编写第一个 Web 服务消费者。

基于Web的服务消费者

编写一个基于网络的消费者,如下所示。将其命名为 WebApp.aspx。请注意,它是一个 ASP.NET 应用程序。将其保存在 Web 服务的虚拟目录 (c:\MyWebServices\WebApp.axpx) 中。

该应用程序有两个文本字段,用于从要添加的用户获取号码。它有一个“执行”按钮,单击该按钮即可获取 Add 和 SayHello Web 服务。

WebApp.aspx
<%@ Page Language = "C#" %>
<script runat = "server">
   void runSrvice_Click(Object sender, EventArgs e) {
      FirstService mySvc = new FirstService();
      Label1.Text = mySvc.SayHello();
      Label2.Text = mySvc.Add(Int32.Parse(txtNum1.Text),  Int32.Parse(txtNum2.Text)).ToString();
   }
</script>

<html>
   <head> </head>
   
   <body>
      <form runat = "server">
         <p>
            <em>First Number to Add </em>:
            <asp:TextBox id = "txtNum1" runat = "server" Width = "43px">4<  /asp:TextBox>
         </p>
			
         <p>
            <em>Second Number To Add </em>:
            <asp:TextBox id = "txtNum2" runat = "server" Width = "44px">5</asp:TextBox>
         </p>
			
         <p>
            <strong><u>Web Service Result -</u></strong>
         </p>
			
         <p>
            <em>Hello world Service</em> :
            <asp:Label id = "Label1" runat = "server" Font-Underline = "True">Label< /asp:Label>
         </p>

         <p>
            <em>Add Service</em> :
            & <asp:Label id = "Label2" runat = "server" Font-Underline = "True">Label</asp:Label>
         </p>
			
         <p align = "left">
            <asp:Button id = "runSrvice" onclick = "runSrvice_Click" runat = "server" Text = "Execute"></asp:Button>
         </p>
      </form>
   </body>
</html>

创建消费者之后,我们需要为要消费的Web服务创建代理。当引用已添加的 Web 服务时,Visual Studio .NET 会自动为我们完成这项工作。以下是应遵循的步骤 -

  • 为要使用的 Web 服务创建代理。该代理是使用 .NET SDK 提供的 WSDL 实用程序创建的。该实用程序从 Web 服务中提取信息并创建代理。代理仅对特定的 Web 服务有效。如果您需要使用其他 Web 服务,您还需要为此服务创建代理。添加 Web 服务引用时,Visual Studio .NET 会自动为您创建代理。使用 .NET SDK 提供的 WSDL 实用程序为 Web 服务创建代理。它将在当前目录中创建 FirstSevice.cs 文件。我们需要编译它来为 Web 服务创建 FirstService.dll(代理)。

c:> WSDL http://localhost/MyWebServices/FirstService.asmx?WSDL
c:> csc /t:library FirstService.cs
  • 将编译好的代理放在Web Service虚拟目录的bin目录下(c:\MyWebServices\bin)。Internet 信息服务 (IIS) 在此目录中查找代理。

  • 创建服务使用者,就像我们已经做的那样。请注意,Web 服务代理的对象是在使用者中实例化的。该代理负责与服务交互。

  • 在 IE 中键入使用者的 URL 进行测试(例如,http://localhost/MyWebServices/WebApp.aspx)。

基于 Windows 应用程序的 Web 服务使用者

编写基于 Windows 应用程序的 Web 服务使用者与编写任何其他 Windows 应用程序相同。您只需要创建代理(我们已经完成)并在编译应用程序时引用该代理。以下是我们使用 Web 服务的 Windows 应用程序。该应用程序创建一个 Web 服务对象(当然是代理)并调用其上的 SayHello 和 Add 方法。

WinApp.cs

using System;
using System.IO;

namespace SvcConsumer {
   class SvcEater {
      public static void Main(String[] args) {
         FirstService mySvc = new FirstService();
         Console.WriteLine("Calling Hello World Service: " + mySvc.SayHello());
         Console.WriteLine("Calling Add(2, 3) Service: " + mySvc.Add(2, 3).ToString());
      }
   }
}

使用 编译它c:\>csc /r:FirstService.dll WinApp.cs。它将创建 WinApp.exe。运行它来测试应用程序和 Web 服务。

现在,问题来了:如何确定该应用程序实际上正在调用 Web 服务?

测试起来很简单。停止您的 Web 服务器,以便无法联系 Web 服务。现在,运行 WinApp 应用程序。它将引发运行时异常。现在,再次启动 Web 服务器。它应该有效。

网络服务 - 安全

安全性对于 Web 服务至关重要。然而,XML-RPC 和 SOAP 规范都没有提出任何明确的安全或身份验证要求。

Web 服务存在三个特定的安全问题 -

  • 保密
  • 验证
  • 网络安全

保密

如果客户端向服务器发送 XML 请求,我们能否确保通信保密?

答案就在这里 -

  • XML-RPC 和 SOAP 主要运行在 HTTP 之上。
  • HTTP 支持安全套接字层 (SSL)。
  • 通信可以通过 SSL 进行加密。
  • SSL 是一项经过验证的技术并得到广泛部署。

单个 Web 服务可能由一系列应用程序组成。例如,一项大型服务可能会将其他三个应用程序的服务捆绑在一起。在这种情况下,SSL 是不够的;消息需要在服务路径上的每个节点进行加密,每个节点代表链中潜在的薄弱环节。目前,这个问题还没有达成一致的解决方案,但一个有希望的解决方案是 W3C XML 加密标准。该标准提供了一个用于加密和解密整个 XML 文档或 XML 文档的一部分的框架。您可以在www.w3.org/Encryption上查看

验证

如果客户端连接到 Web 服务,我们如何识别用户?用户是否有权使用该服务?

可以考虑以下选项,但对于强认证方案还没有明确的共识。

  • HTTP 包含对基本和摘要式身份验证的内置支持,因此可以采用与当前保护 HTML 文档大致相同的方式来保护服务。

  • SOAP 数字签名 (SOAP-DSIG) 利用公钥加密技术对 SOAP 消息进行数字签名。它使客户端或服务器能够验证对方的身份。请访问www.w3.org/TR/SOAP-dsig进行检查。

  • 结构化信息标准促进组织 (OASIS) 正在研究安全断言标记语言 (SAML)。

网络安全

目前这个问题没有简单的答案,并且一直是很多争论的话题。目前,如果您确实想要过滤掉 SOAP 或 XML-RPC 消息,一种可能性是过滤掉所有将其内容类型设置为 text/xml 的 HTTP POST 请求。

另一种替代方法是过滤 SOAPAction HTTP 标头属性。防火墙供应商目前也在开发专门用于过滤 Web 服务流量的工具。

网络服务 - 标准

本章让您了解与 Web 服务相关的所有最新标准。

交通

BEEP,即块可扩展交换协议(以前称为 BXXP),是一个用于构建应用程序协议的框架。它已被 IETF 标准化,它对 Internet 协议的作用就像 XML 对数据的作用一样。

消息传递

这些消息传递标准和规范旨在提供一个在分散的分布式环境中交换信息的框架。

描述和发现

仅当潜在用户可以找到足以允许其执行的信息时,Web 服务才有意义。这些规范和标准的重点是定义一组支持企业、组织和其他 Web 服务提供商的描述和发现的服务;他们提供的网络服务;以及可用于访问这些服务的技术接口。

安全

使用这些安全规范,应用程序可以进行旨在与通用 Web 服务框架配合使用的安全通信。

管理

Web 服务可管理性被定义为一组用于发现 Web 服务架构中 Web 服务的存在、可用性、运行状况、性能、使用以及控制和配置的功能。随着 Web 服务变得普遍且对业务运营至关重要,管理和实施它们的任务对于业务运营的成功至关重要。

Web 服务 - 摘要

在本教程中,您学习了如何使用 Web 服务。然而,Web 服务还包括 WSDL、UDDI 和 SOAP 等有助于使其活跃的组件。下一步是学习 WSDL、UDDI 和 SOAP。

WSDL

WSDL 是一种基于 XML 的语言,用于描述 Web 服务以及如何访问它们。

WSDL 描述 Web 服务以及该 Web 服务的消息格式和协议详细信息。

要了解有关 WSDL 的更多信息,请访问我们的WSDL 教程

UDDI

UDDI 是一种基于 XML 的标准,用于描述、发布和查找 Web 服务。

要了解有关 UDDI 的更多信息,请访问我们的UDDI 教程

肥皂

SOAP 是一种简单的基于 XML 的协议,允许应用程序通过 HTTP 交换信息。

要了解有关 SOAP 的更多信息,请访问我们的SOAP 教程