第二十二章Web服务.ppt

上传人:sccc 文档编号:5296344 上传时间:2023-06-23 格式:PPT 页数:154 大小:1.57MB
返回 下载 相关 举报
第二十二章Web服务.ppt_第1页
第1页 / 共154页
第二十二章Web服务.ppt_第2页
第2页 / 共154页
第二十二章Web服务.ppt_第3页
第3页 / 共154页
第二十二章Web服务.ppt_第4页
第4页 / 共154页
第二十二章Web服务.ppt_第5页
第5页 / 共154页
点击查看更多>>
资源描述

《第二十二章Web服务.ppt》由会员分享,可在线阅读,更多相关《第二十二章Web服务.ppt(154页珍藏版)》请在三一办公上搜索。

1、第二十二章 Web 服务,本章的学习内容包括六个方面:1理解什么是 Web 服务2理解 Web 服务的构成元素,例如“服务说明”和“发现文件”3学会创建 Web 服务4学会创建使用 Web 服务的客户端5理解 Web 服务中的会话跟踪6学会在 Web 服务和 Web 客户端之间传递用户自定义数据类型,22.1概述通过创建“动态链接库”(DLL)来改善软件重用及模块化能力,是良好的面向对象编程的根基之一。但若没有远程访问技术提供辅助,例如“分布式组件对象模型”(Distributed Component Object Model,DCOM)、“远程过程调用”(Remote Procedure C

2、all,RPC)以及.NET Remoting 等等,则 DLL 的用途就非常有限的,因为 DLL 和使用它的程序必须在同一台计算机上。本章介绍如何使用 Web 服务(也称为 XML Web 服务)增强分布式系统中的软件重用性。使分布式系统,应用程序可以在网络上的多台机器中执行。,Web 服务是一种特殊应用程序,它允许一台机器利用通用的数据格式和协议(比如使用 XML 描述的调用请求、数据)来调用其他机器上的方法,从而实现分布式计算。.NET 通过“简单对象访问协议”(Simple Object Access Protocol,SOAP)来实现这种这种方法调用。SOAP 是一种基于 XML 的

3、协议,它描述了怎样对方法的请求和响应进行标记,使其能通过 HTTP 等协议来传输。使用 SOAP,应用程序可采取一种标准格式(即 XML 描述格式)来表示数据和转换数据。Web 服务的底层实现与使用 Web 服务的客户端无关。,随着全球 Internet 用户越来越多,应用程序“跨网调用方法”的概念变得越来越实际。Web 服务使面向对象的程序开发不再只依赖由一个地点提供的少量类库;而可以灵活地访问由多个地点提供的大量类库。微软鼓励软件开发商和从事电子商务的公司部署 Web 服务。这种技术还有利于商家展开业务合作且共同进步。通过采购和自己业务有关的 Web 服务,创建应用程序的公司可花较少的时间

4、来编程,而花更多的时间来开发新产品。Web 服务的提供者也相应地受益。本章首先简单介绍 Web 和 Web 协议。然后探讨创建和使用 Web 服务所涉及的方法和步骤。本章的实例,都先提供 Web 服务的代码,再提供使用该 Web 服务的示范性应用程序。,22.2HTTP 请求类型HTTP 定义了几种请求类型(也称为“请求方法”),它们指定了一个客户端怎样从服务器请求信息。两种最常见的 HTTP 请求类型是 get 和 post,它们获取客户表单数据,并将其发送给 Web 服务器。表单是一种 HTML 元素,其中可以包含文本域、单选钮、复选框以及其他 GUI 组件。这些组件允许用户在一个网页中输

5、入信息。表单也可以包含隐藏的域,它们不作为 GUI 组件在屏幕上显示。get 请求将表单数据作为 URL 的一部分发送(如 query=userquery)。在这个虚拟的请求中,问号?之后的信息(也就是 query=userquery)代表用户的输入,例如,用户要搜索“Massachusetts”,,URL 的最后一部分就应该是 query=Massachusetts。在 get 请求中,查询字符串的长度是有限的,而且不同服务器具有不同的限制。如果查询字符串的长度超出限制,就必须使用 post 请求。post 请求中的数据不是 URL 的一部分,用户看不见它们。如果表单包含许多字段,通常要由

6、post 请求来提交。一些敏感的表单字段,比如密码,也通常要用 post 请求来发送。)HTTP 请求通常要将数据发给一个服务器端,例如,用户在填好一个网上调查表之后,表单中填写的数据要作为请求的一部分发送给 Web 服务器,并由服务器上运行的一个表单处理程序来处理。,浏览器通常会“缓存”服务器对 get 请求的响应网页(将网页暂存到本地磁盘),以加快重载速度,减少浏览器的数据下载量。例如,一个像课程提纲那样的静态网页就会被缓存起来,以便满足用户的重复请求。然而,浏览器通常不缓存服务器对 post 请求的响应,因为后续的 post 请求可能包含不同的信息。例如,参加网上调查的几个用户可能请求相

7、同的网页。每个用户的响应都可能改变总体调查结果,从而改变 Web 服务器上的数据。所以每个请求所获得的响应(调查结果)网页将显示不同的信息。,22.3多层体系结构Web 服务器是“多层应用程序”的一部分。多层应用程序使用独立的“层”(也就是逻辑性的功能分组)来分解应用程序的总体功能。不同的层可以在同一台计算机上,也可以在网络中的多台计算机上。下图展示了一个 3 层应用程序的基本结构。,其中,“信息层”(也称为“数据层”或“底层”)维护着应用程序所需的数据。这个层通常将数据存储到一个“关系数据库管理系统”(Relational Database Management System,RDBMS)中

8、。“中间层”实现了业务逻辑(Business Logic)功能和表示逻辑(Presentation Logic)功能,宗旨是控制客户层和数据的交互。中间层相当于信息层上的数据与客户端之间的一个中间人。它的控制逻辑处理来自客户层的请求,并从信息层的数据库中获取数据。它的表示逻辑处理来自信息层的数据,并将内容呈现给客户层。在基于 Web 的应用程序中,中间层的表示逻辑通常以 HTML 文档的形式来呈现内容。,中间层上的业务逻辑用于强制“业务规则”,首先确保数据是可靠的,然后才实际地更新数据库或者向用户呈现数据。业务规则限制了客户端怎样访问应用程序数据,不能访问哪些数据,以及应用程序怎样处理数据。“

9、客户层”(顶层)是应用程序的用户界面。使用者通过用户界面直接与应用程序交互。客户层则与中间层交互,以便发出请求,并从信息层检索数据。最后,客户层将从中间层获取的数据呈现给用户。,22.4访问 Web 服务器为了从 Web 服务器请求文档,用户必须知道文档的 URL。URL 包含 Web 服务器所在的那台机器的名称(称为“主机名”)。用户既可以从“本地 Web 服务器”请求文档,也可以从“远程 Web 服务器”请求文档,前者是在用户自己机器上运行的 Web 服务器,后者则是在网络中其他机器上运行的 Web 服务器。访问本地 Web 服务器可通过两种方式:通过机器名,或者通过 localhost(

10、引用本地机器的一个主机名)。在 Windows XP 中,可右击 我的电脑,从弹出菜单中选择 属性,打开 系统属性 对话框。在这个对话框单击 计算机名 选项卡后,在“完整的计算机名称:”区域就显示了本地机器的计算机名。,域名代表 Internet 上的一组主机;它与主机名(比如 www 是 Web 服务器使用的一个常见的主机名)和顶级域名(Top-Level Domain,TLD)合并,构成一个“完全合格的主机名”。这样一来,就可以采用一种对用户友好的方式来标识 Internet 上的站点。在完全合格的主机名中,TLD 通常描述拥有域名的组织类型。例如,com 通常代表商业组织,而 org 通

11、常代表非赢利组织。此外,每个国家都有自己的 TLD,比如 cn 代表中国,et 代表埃塞俄比亚,om 代表阿曼,us 而代表美国。每个完全合格的主机名都要和一个不重复的数值地址匹配,这种地址称为“IP 地址”,计算机根据 IP 地址来定位 Internet 上的其他计算机。,DNS(Domain Name System)服务器是维护着一个大型数据库的计算机,数据库中存储着主机名及其相应的 IP 地址。这个转换称为“DNS 查找”。例如,为了访问 Deitel 网站,只需在 Web 浏览器中输入主机名()。随即,DNS 服务器会将 转换成 Deitel 网站的 Web 服务器的 IP 地址(63

12、.110.43.82)。注意,本地机器名 localhost 对应的 IP 地址是 127.0.0.1。,22.5简单 HTTP 事务处理探索基于 Web 的应用程序开发之前,有必要对网络技术以及 www 有一个基本理解。本节将讨论超文本传输协议(HTTP)的内部工作原理,并讨论当浏览器显示网页时,幕后发生的事情。HTTP 指定一系列“方法”(Method)和“标头”(Header),它们允许客户端和服务器采取统一的、可预测的方式进行交互及交换信息。网页最简单的形式就是一个 HTML 文档。该文档是纯文本文件,其中包含“标记”,向 Web 浏览器描述如何显示和格式化文档的信息。例如以下 HTM

13、L 标记:My Web Page,向浏览器指出起始标记 和结束标记 之间的文本是网页“标题”。HTML 文档还可包含“超链接”,它允许用户在不同的网页之间的导航。用户激活一个链接之后(通常就是鼠标单击它),被请求的网页(包括同一网页的不同部分)会在用户的浏览器窗口中加载。可通过 Web 来浏览的任何文档都有一个“统一资源定位符”(URL),它是指定了资源位置的一个地址。URL 包含的信息将浏览器定向到用户希望访问的资源文档。运行“Web 服务器”的计算机负责提供这种资源。用 Visual Studio.NET 来开发 Web 服务时,使用的 Web 服务器是 Microsoft Interne

14、t 信息服务(IIS)器。下面来看看一个 URL 的组成部分:,http:/指出资源要通过 HTTP 获取。中间的 部分是服务器的完全合格主机名。主机名是资源所在的那台计算机的名称。通常将这种计算机称为“主机”,因为它容纳并维护着资源。主机名 会转换成一个 IP 地址(63.110.43.82),它采取与电话号码类似的方式来标记一个服务器。主机名到 IP 地址的转换通常由“域名服务器”(DNS)来执行。DNS 维护着主机名及其对应 IP 地址的一个数据库。这种转换过程通常称为“DNS 解析”。URL 的剩余部分指定要请求的资源(/books/downloads.htm),这是一个 HTML 文

15、档。,在 URL 的这部分中,包含目标资源的名称(downloads.htm)及其在 Web 服务器上的路径或位置(/books)。路径可以是 Web 服务器的文件系统上的一个实际目录。但为了安全起见,该路径通常是一个“虚拟目录”。在这种系统中,服务器将虚拟目录转换成服务器(或者服务器的本地网络中的另一台计算机)上的一个真实位置。这样便隐藏了资源的真实位置。此外,有的资源是动态创建的,不存在于服务器计算机的任何地方。在与这种资源对应的 URL 中,主机名指定了正确的服务器;路径和资源信息则指出负责响应客户请求的哪个动态资源的位置。,给出一个 URL 后,浏览器要执行简单事务处理来获取并显示一个

16、网页。下图展示了该事务处理过程,它由 Web 浏览器与 Web 服务器应用程序之间的交互构成。图中,Web 浏览器向服务器发送了一个 HTTP 请求。例如,本例中给出的这种请求的最简单形式一个实例:GET/books/downloads.htm HTTP/1.1其中,GET 是一个“HTTP 方法”,指出客户端要从服务器请求一个资源。在请求的剩余部分,指定了资源(一个 HTML 文档 downloads.htm)的路径名称(/books/)以及协议的名称和版本号(HTTP/1.1)。,理解 HTTP/1.1 协议的服务器会翻译这个请求并进行响应。下图展示了一次成功请求的结果:服务器首先发出指定

17、 HTTP 版本的文本,后跟一个数值代码和短语,描述事务处理的状态。例如:,Internet,HTTP/1.1 200 OK表明成功,如果本次事务处理的状态为:HTTP/1.1 404 Not Found表明 Web 服务器找不到请求的资源。,Internet,然后,服务器发出一个或多个“HTTP 标头”,它们提供了和准备发送的数据有关的其他信息。在本例中,服务器发送的是一个 HTML 文档,所以 HTTP 标头是:Content-type:text/html这个标头提供的信息指定了要发送给浏览器的内容的 MIME(多用途 Internet 邮件扩展)类型。MIME 是一个 Internet

18、标准,规定了消息应该如何格式化,以便程序正确解释数据。例如,MIME 类型 text/plain 指出是纯文本内容,Web 浏览器应该直接显示,不要将任何内容解释成 HTML 标记。类似地,image/gif 指出内容是 GIF 图象。浏览器收到这种内容时,应该尝试显示图片。,标头之后是一个空行,向客户端指出服务器已完成 HTTP 标头的发送。然后,服务器发送请求的 HTML 文档(例如本例中请求的 downloads.htm)的内容。一旦资源传输结束,服务器将中断连接。之后,客户端浏览器会解释它收到的 HTML,并呈现(显示)结果。,22.6ASP.NETMicrosoft ASP.NET

19、是.NET 战略的不可分割的一部分,它是创建用 HTML 来标记的动态 Web 内容的一种技术。与 Windows 应用程序相似,同样可以在 Visual Studio.NET 中创建 ASP.NET 网页。ASP.NET 开发者可利用.NET 的各种面向对象语言以及 FCL 提供的“Web 控件”来快速创建多层的、涉及大量数据库操作的应用程序。Web 控件与 Windows 应用程序所用的控件相似,但它们是专门为网页设计的。ASP.NET 是一种复杂的技术,你主要应该关心 ASP.NET 应用程序的性能、测试与安全性。,虽然 Visual Studio.NET 目前没有提供太多的工具来简化用

20、 Visual C+进行 ASP.NET Web 应用程序开发,但还是可以利用一些工具来创建利用了 ASP.NET 技术的 Web 服务。这些 Web 服务也称为“ASP.NET Web 服务”。用 ASP.NET 来创建 Web 服务具有的优势是:首先,ASP.NET 是基于.NET Framework 而构建的,允许 Web 服务利用 CLR(公共语言进行时库)的某些特性,比如内存管理、互操作性以及软件重用性;其次,Web 服务还能从 ASP.NET 优化中获得好处。使用 ASP.NET 和 Visual Studio.NET 创建 Web 服务时,许多编程细节都是隐藏的。本章在后面将会展

21、示相关的实例。,22.7.NET Web 服务基础知识Web 服务是存储在一台机器上的应用程序,但其他机器可通过网络访问它。正是由于存在这种关系,所以一般将 Web 服务所在的机器称为“远程机器”。希望访问 Web 服务的应用程序要向远程机器发出一个方法调用,并传递恰当的参数。远程机器处理这个调用,并向调用者发送一个响应。这种分布式计算可使多种系统获益,其中包括不能访问特定数据的系统,以及没有能力执行特定计算的系统。Web 服务最简单的形式就是一个类。前面所涉及的项目中包含的类(或在项目中定义,或是对已编译的 DLL 的引用)都必须在同一台机器上。,使用 Web 服务时,希望包含到项目中的类(

22、包括已编译好的 DLL)位于远程机器上,而在当前应用程序的项目中没有该类的一个已编译版本。大多数 Web 服务请求和响应都是通过 SOAP(简单对象访问协议)来发送的。换言之,任何能生成和处理 SOAP 消息的客户端都能使用 Web 服务,而无论 Web 服务用什么语言来编写。SOAP 的详细内容在下一节讨论。由于 Web 服务和 SOAP 都与平台无关,所以公司之间能相互协作,并利用对方的 Web 服务,无需担心技术或程序语言上的兼容问题。所以,Web 服务是推动 B2B(商家到商家)业务的一种廉价的、立即可用的方式。,为了在 Visual Studio.NET 中创建一个 Web 服务,开

23、发者首先要创建“ASP.NET Web 服务”类型项目。然后,Visual Studio.NET 会自动生成包含 Web 服务代码(用于实现 Web 服务)的文件:一个 ASMX 文件(提供了 Web 服务文档)以及一个 DISCO 文件(潜在的客户端可利用它来发现 Web 服务)。下图中展示了构成 Web 服务的不同文件,开发者创建“ASP.NET Web 服务”应用程序时,Visual Studio.NET 会自动生成代码文件,以便包含 Web 服务类以及作为 Web 服务实现的一部分的其他代码。Web 服务类中定义了要由 Web 服务向远程应用程序发布的所有方法。开发者希望在 Web 服

24、务中集成的所有方法都必须添加到这个类中。对于希望发布的每个方法,开发者都必须把它标记为“Web 方法”。本章稍后的内容中将演示怎样标记 Web 方法。注意,默认情况下,Visual Studio.NET 只为 Web 服务实现自动生成一个.h 文件和一个.cpp 文件。较复杂的 Web 服务可能需要添加许多其他代码文件。,开发者在 Web 服务代码文件中添加了必要的程序逻辑,并成功编译 Web 服务之后,客户端应用程序就可以使用 Web 服务。为此,客户端首先必须能够发现 Web 服务,并了解它的功能。DISCO(Discovery of Web services)“Web 服务发现”是 Mi

25、crosoft 的一种专用技术,它用于寻找服务器上的一个特定目录中的 Web 服务。有 4 种类型的 DISCO 文件:.disco、.vsdisco、.discomap 以及.map 文件。其中,.vsdisco 文件位于 Web 服务应用程序目录中,而.disco 文件要通过 ASMX 页来访问。这 4 种 DISCO 文件都包含了帮助客户端定位 Web 服务文件的 XML。.disco 文件含有对 Web 服务的各个文档的引用。,.vsdisco 文件则稍有不同,它并不是静态地包含与 Web 服务有关的标记。只有在请求.vsdisco 文件时,才会动态生成与 Web 服务有关的标记。在生

26、成的标记中,含有对 Web 服务文档的引用,这些信息会返回给用户。换言之,.vsdisco 文件总能提供与系统上的 Web 服务有关的最新信息。具体地说,当一个潜在的客户端请求一个.vsdisco 文件时,.NET Framework 会分析.vsdisco 文件所在的目录以及该目录下的子目录。然后,.NET Framework 会生成相应的标记(采用与.disco 文件相同的语法),其中含有对那个目录及其子目录中的所有 Web 服务的引用。通常,.vsdisco 文件只用于指定那些不应搜索的目录,开发者一般不用查看它。,.vsdisco 文件的重要作用是“被客户端请求”,(通过 Web 来访

27、问)。注意,每次请求时,都会生成并显示新的标记。那么,两种类型的 DISCO 文件到底应该如何选择?.vsdisco 文件能为开发者带来好处,因为文件中包含的数据量很小,而且提供了与服务器的 Web 服务文件有关的最新信息。但.vsdisco 文件要比.disco 文件产生更大的处理开销,因为每次访问.vsdisco 文件,都必须执行一次搜索操作。因此,有些开发者认为更好的做法是人工更新.disco 文件。许多系统都同时使用两种文件。本节后面讲到,使用 ASP.NET 创建的 Web 服务允许在请求时生成一个.disco 文件。该.disco 文件只包含当前 Web 服务中的文件的引用。,所以

28、,开发者通常会在服务器根目录放置一个.vsdisco 文件。访问它时,就会在系统中自动寻找用于各个 Web 服务的.disco 文件,并根据这些.disco 文件的标记来返回与整个系统有关的信息。客户在发现了一个 Web 服务之后,接着必须获得与 Web 服务的功能有关的细节,并了解怎样使用那个功能。为此,Web 服务通常要包含一个服务说明。服务说明是一个 XML 文档,它遵循“Web 服务说明语言”(Web Service Description Language,WSDL)所定义的规范。WSDL 是一个 XML 词汇表,定义了 Web 服务提供的方法,以及客户端与那些方法进行交互的方式。W

29、SDL 文档还提供了客户端可能需要的一些较低级的信息,比如请求和响应的格式等等。,虽然 WSDL 文档提供了这些信息,但 WSDL 理解起来可能比较困难。创建 Web 服务时,Visual Studio.NET 会在 Web 服务器的相应 Web 服务的子目录中生成一个扩展名为.asmx 的 ASMX 文件。该文件可在 Web 浏览器中使用 HTTP 请求,通过 URL 进行访问(例如,http:/localhost/HugeInteger/HugeInteger.asmx)。Web 服务器对该文件访问请求的响应是提供该 Web 服务的各种方法的说明信息,以及如何对这些方法进行测试。ASMX

30、文件还指出了编译好的程序集,其中包含 Web 服务的具体实现。Web 服务器收到对 Web 服务的一个请求时,会调用 ASMX 文件,该文件又会调用 Web 服务的实现。,要查看有关 Web 服务的更多的技术信息,开发者可访问由 ASP.NET 生成 WSDL 文件。下图是向 Web 服务器请求访问 ASMX 文件,在 Web 浏览器中显示了有关 HugeInteger Web 服务(用于最多 100 位的正整数计算,判断大小、求和、求差)。网页顶部提供了一个链接来访问 Web 服务的“服务说明”(Service Description)。Visual Studio.NET 能自动生成 WSD

31、L 服务说明。编译客户端程序时,可根据WSDL 服务说明来确定方法调用的正确性。,Web服务的各个方法的链接,“服务说明”链接,ASP.NET 并不创建实际的 WSDL 文件。相反,ASP.NET 会动态生成 WSDL 信息。如果客户端请求 Web 服务的 WSDL 文件(要么将 WSDL 附加到 ASMX 文件的 URL 上,要么单击“服务说明”(Service Description)链接),ASP.NET 就会生成 WSDL 说明,它随即会返回给客户段端,并在 Web 浏览器中显示。由于 WSDL 文件是在请求时生成的,所以客户端可以确保 WSDL 中包含了最新的信息。程序员不应更改服务

32、说明,因为它定义了一个 Web 服务的工作方式。单击 ASMX 页顶部的“服务说明”(Service Description)链接,就会显示 WSDL,它定义了这个 Web 服务的服务说明,如下图所示:,如前所述,Web 服务的.disco 文件是通过 ASMX 页来访问的。与 WSDL 数据相似,ASP.NET Web 服务的.disco 信息平常并不存储到一个物理文件中。.NET Framework 会在一个客户端请求时生成该文件(将?DISCO 附加到 ASMX 的 URL 之后,就能发出这个请求)。既然潜在的客户端已经知道了 Web 服务的 ASMX 文件的 URL,就已经发现了 We

33、b 服务,还有必要以这种方式访问.disco 文件吗?注意,在客户端请求一个.vsdisco 文件时,也可能访问.disco 文件。例如,在访问一个.vsdisco 文件时,会导致.NET Framework 搜索当前目录及其子目录中的所有 Web 服务。在这种情况下,.NET Framework 实际搜索的是 ASMX 文件、.disco 文件以及.vsdisco 文件。所以,.disco 文件中的信息可能返回给对这台机器上的 ASMX 文件一无所知的客户端。,通过访问.disco 文件而返回数据会放置到.discomap 文件中,后者是另一个类型的 DISCO 文件。在前面所示的 ASMX

34、 页中,“服务说明”(Service Description)链接下方列出了 Web 服务提供的各个方法。单击任何方法名,都会请求一个对方法进行描述的测试页(如下图)。除了对方法的参数进行解释,测试页还允许用户输入恰当的参数值,然后单击 调用(Invoke)按钮来实际地测试方法。该按钮下方显示了示范请求及响应消息,它们分别使用了 SOAP、HTTP GET 和 HTTP POST 协议。我们可选用这些协议在 Web 服务中收发消息。用于发送请求及响应消息的协议也称为 Web 服务的“有线协议”或“有线格式”(wire format),因为它定义了信息如何“沿着(通信)电缆”发送。,SOAP 是

35、一种更通用的有线格式,因为无论 HTTP GET 还是 HTTP POST,它们都要依赖于 HTTP 协议。而 SOAP 也可以通过其他传输协议来发送。下图展示了 HugeInteger 的 Bigger 方法的测试页。在这个页中,用户可在 first:和 second:区域分别输入两个“巨整数”值,然后单击 调用(Invoke)按钮,从而测试这个方法。方法执行时,会打开一个新的 Web 浏览器窗口,它显示了包含结果的一个 XML 文档。注意,使用 Web 服务的 ASMX 页来测试和调试方法,使 Web 服务变得更可靠,它还能有效地避免 Web 服务的客户在使用时遇到错误。,前面讨论了构成一

36、个.NET Web 服务的各种文件,现在再来讨论一个.NET Web 服务客户端,如下图所示。.NET 客户端可以是任何类型的.NET 应用程序,比如 Windows 程序或者控制台应用程序。开发者只需添加一个 Web 引用,就能在他们的应用程序中使用别人提供的 Web 服务。这个操作会将相关的文件添加到客户端应用程序中,以便客户端访问 Web 服务。,在 Visual Studio.NET 添加一个 Web 引用方法是在资源管理器中右击项目名,再选择添加 Web 引用(Add Web Reference)。在随后出现的对象框中请指定要使用的 Web 服务。Visual Studio.NET

37、随即会在客户端应用程序中添加一个恰当的 Web 引用。在后面的实例中将演示如何添加 Web 引用。,开发者指定了希望使用的 Web 服务之后,Visual Studio.NET 会访问 Web 服务的 WSDL 文件,并制作一个拷贝。这个拷贝会存储到项目文件夹中。WSDL 文件中的信息用于创建“代理”类,它负责 Web 服务的方法调用所需的全部“交接”工作。客户端应用程序调用 Web 服务的方法时,实际调用的是代理类中的一个对应的方法。该方法获取 Web 服务方法的名称和参数,然后对其格式化,使其能在一条 SOAP 消息中作为请求发送出去。Web 服务接收到这个请求,调用执行方法,并将结果作为

38、另一条 SOAP 消息送回。客户端应用程序收到包含响应的 SOAP 消息之后,代理类会对其进行解码,并对结果进行格式化,使客户端应用程序访问它们。随后,信息会返回给客户端。下图展示了客户端代码、代理与 Web 服务之间的交互。,.NET 客户端的代理类用来处理 SOAP 请求/响应,.NET Web 服务也包含它们自己的代理功能。但这种功能是由.NET Framework 提供的,而不是存储在物理文件中(这一点有别于客户端的代理)。注意,.NET 环境在程序员面前隐藏了我们前面讨论的大多数细节。创建和使用 Web 服务时,许多细节(比如 WSDL、ASMX 文件、代理类和 DISCO 文件的生

39、成)都是由 Visual Studio.NET 和 ASP 自动完成的。使得开发者从创建这些文件的繁琐过程中被解放出来,但如有必要,仍可自己修改这些文件。,Web服务,Internet,22.8SOAP 和 Web 服务简单对象访问协议(SOAP)是一种与平台无关的协议,它使用 XML,并通过 HTTP 来发出远程过程调用。每个请求和响应都封装在一条“SOAP”消息中。SOAP 消息本质上是一条 XML 消息,其中包含了处理它的内容所需的一切信息。SOAP 消息之所以非常流行,是因为它们是采用易于理解的、而且与平台无关的 XML 来编写的。类似地,之所以选择 HTTP 来传送 SOAP 消息,

40、是因为 HTTP 乃 Internet 上的标准信息传送协议。使用 XML 和 HTTP,不同的操作系统可以顺利收发 SOAP 消息。HTTP 的另一个好处是,它能在部署了防火墙(限制网络通信的一道安全防线)的网络中使用。,SOAP 支持众多数据类型。注意,用于传输请求和响应的“有线格式”(比如 SOAP)必须支持应用程序之间传递的所有数据。与使用了其他有线格式的 Web 服务相比较,使用 SOAP 的 Web 服务能支持多得多的数据类型。SOAP 支持的数据类型包括最基本的数据类型(比如 int),和诸如 DataSet,DateTime,XmlNode 等复杂数据类型。还允许传输所有这些类

41、型的数组。此外,用户自定义类型也得到了支持。应用程序通过 SOAP 向 Web 服务发送请求,并从 Web 服务获得响应。程序调用 Web 服务的一个方法时,请求和相关信息都会封装到一条 SOAP 消息中,并发到相应的目的地。Web 服务收到这条消息后,首先处理的是“SOAP 信封”所包含的内容,,它指定了客户端希望执行的方法,和由客户传给那个方法的参数(如果有的话)。方法的调用结果则通过另一条 SOAP 消息送回客户端。客户端需要分析这个响应,提取方法调用结果。下面的 SOAP 请求消息摘录自 HugeInteger Web 服务的 Bigger 方法。该 Web 服务为程序员提供了几个方法

42、来处理比 long 变量能够支持的最大整数还要大的“巨整数”。大多数程序员都不必亲自处理 SOAP 消息,而是让 Web 服务处理传输细节。1POST/HugeInteger/HugeInteger.asmx HTTP/1.1 2Host:localhost 3Content-Type:text/xml;charset=utf-8 4Content-Length:length,5SOAPAction:http/6 7 11 12 13string 14string 15 16 17,一旦客户希望执行 HugeInteger Web 服务提供的 Bigger 方法,就会创建这个请求。一个 Web

43、 服务请求导致创建了这样一个 SOAP 请求之后,first 和 second 元素的字符数据(string)将包含用户实际输入的值(第 1314 行)。如果这个信封包含如前面 Bigger 方法测试页中所示的请求,first 和 second 元素就包含了前面 Bigger 方法测试页中输入的数据值。第 4 行的占位符 length 则会包含这条 SOAP 消息的长度。,22.9发布和使用 Web 服务本节我们将指导如何创建一个 Web 服务和一个 Web 服务客户端。实例1 HugeInteger 是一个 Web 服务。这个 Web 服务设计用于对最大 100 位的整数执行计算。该 Web

44、 服务提供的方法要获取两个“巨整数”参数,并可判断二者大小,是否二者相等,并计算二者的和与差。可将这些方法想象成应用程序通过 Web 为其他程序员提供的服务(这正是“Web 服务”一词的来历)。所有程序员都能访问该 Web 服务,使用它的方法,并避免亲手编写实现该服务功能所需要的代码。在 Visual Studio.NET 中,使用 C+CLI 创建一个 Web 服务的方法和步骤如下(以创建 HugeInteger 为例):,1创建一个名为 HugeInteger 的 Web 服务项目,2编写 Web 服务(HugeInteger)确定 Web 服务的命名空间需要使用 WebServiceAt

45、tribute 类型(位于 System:Web:Services 命域空间中)的属性 Namespace 能够指定 Web 服务的命名空间(参见下面的代码),从而惟一性地标识该 Web 服务。如果系统给出缺省的命域空间(http:/tempuri.org),使用该缺省命名空间进行演示是足够的,但实际部署 Web 服务时,应该用自己确定的命名空间替换缺省命名空间。例如,本例使用的命名空间为:http:/,使用 WebServiceAttribute 类型的另一个属性 Description 可以提供在 ASMX 文件中出现的与 Web 服务有关的描述信息。例如,本例中提供的该描述信息为:A W

46、eb service which provides methods that can mannipulate large integer values.本例中完成上述设置的代码如下:WebServiceAttribute(Namespace=http:/=A Web service which provides methods that can mannipulate large integer values.),定义提供 Web 服务的自定义类缺省情况下,Visual Studio.NET 会自动创建一个从 WebService类型(位于 System:Web:Services 命名空间中)

47、派生的自定义类型,例如,本例中被命名为 HugeIntegerClass 的类型。虽然 Web服务并非一定需要是 WebService 类型的派生类型,但利用该基类型提供的成员,可以非常方便地获取有关客户端以及 Web 服务本身的信息。例如,WebService 类型包含一个会话 Session 类型对象,我们在后面的实例中需要用该会话 Session 类型对象存储一个客户端的信息,使得 Web 服务方法在被不同客户端调用之间,能够保持特定的客户端信息,满足服务对象的唯一性。,为 Web 服务的自定义类添加方法Web 服务的自定义类的方法可以包含远程调用的方法和非远程调用方法。其中,远程调用方

48、法必须标记为 WebMethod 属性。根据 HugeInteger 的设计需求,HugeIntegerClass 类型中包含的远程调用方法包括:Bigger,EqualTo,Smaller,Add 和 Subtract。例如,Add 方法的原型声明如下:WebMethod(Description=Adds two huge integers.)String Add(String first,String second);其中,Description 是 WebMethod 的一个属性,用于为 ASMX 页提供与该方法有关的信息。因此,编写该信息应该使使用该 Web 服务的客户端能清楚地了解需

49、要调用的方法的有关信息。,注意,如果调用 Web 服务提供的远程方法没有用 WebMethod 属性标记,就会产生编译错误。另外,Web 服务的方法不能声明为 static,否则会产生编译错误。换句话说,客户端要想访问 Web 服务的一个方法,那个 Web 服务的实例必须存在。Add 方法的操作定义在.cpp 文件中,如下所示:String HugeIntegerClass:Add(String first,String second)int carry=0;HugeIntegerClass operand1=FromString(first);HugeIntegerClass operand

50、2=FromString(second);/store result of additionHugeIntegerClass result=gcnew HugeIntegerClass();,/perform addition algorithm for each digitfor(int i=0;i Indexi=(operand1-Indexi+operand2-Indexi+carry)%10;/store remainder of dividing sums of two digits by 10carry=(operand1-Indexi+operand2-Indexi+carry)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号