2002-09-16 10:47
Microsoft .NET XML Web服务
Robert Hess
Microsoft Corporation
2001 年 8 月
20 日
好了,近来每个人都在谈论 XML Web 服务:一般形式的,或是通过 .NET 提供的;谈论它们使用 Microsoft Visual Studio? 更容易开发,以及它们将成为 HailStorm(仍然是一个代号)的基础。如果您读过任何有关的文档、白皮书或是新闻资料,您一定会淹没在各种结构图、业务模型试验、服务基础构造讨论和其他类似的内容中,怕是要消化不良了吧。我在过去几个月中一直在努力帮您消化这些东西。但是这到底是什么东西,怎样才能真正利用它呢?
在本文中,我会提供一些非常简单的代码,演示 XML Web 服务是如何直接了当,以及您如何才能立即开始使用它们。
任何一个有长期计算机工作背景的人都会记得,早年市场上有各种各样相互竞争的计算机系统。我指的不是大学和专业数据处理机构使用的大型机,而是家用计算机。Apple、IBM、Texas Instruments、KayPro、Commodore、Timex、Radio Shack 甚至 Mattel 都在生产各种规格和型号的个人计算机。那时关于为什么某种计算机优于其他计算机的争论层出不穷,但是我记得我自己那时的感受。
在了解和尝试各种计算机之后,我看中的是那些对程序员而言能够立即发挥作用的产品。我指的是那些能够完成更多任务,而不是只能运行预装的程序(通常是游戏软件)的计算机。我最喜欢的是那些能让我坐下来写一些自己的代码、而不用购买任何额外软硬件的计算机。我能够编写的程序不是被人为限定的,而是能够访问计算机系统的各个层面。这才是“发挥作用”的计算机。
我的第一台计算机是 TI 99/4A。在当时的计算机中,它非常棒:内置 BASIC、彩色显示器和可编程的屏幕字体。但是,内置 BASIC 是一个限制。要编写汇编程序,不仅需要购买额外的开发软件,还需要扩展内存模块 (EMM),而且要运行程序的人也需要有 EMM。经过短暂的辉煌,TI 最终从市场上淡出了。我接下来用的是一台 Apple //c。这是一台功能完备的计算机,可以用来编写 BASIC 或汇编程序,其丰富的功能也使您能够访问内置在固件中的底层功能。它开箱就能使用,不需要购买任何额外的设备。
所有这些都强调了我认为对于技术成功很重要的一点:应用广泛,使用简便,无需专用软硬件。使一种技术变得对普通用户来说易于访问并且有用,那么它将更容易脱颖而出。这些和 XML Web 服务有什么关系呢?
这些说明了我为什么要激动地宣传 XML Web 服务的优秀之处。不过,如果不自己安装全套软件来实际看看这些好处,那么它们就都是虚的。所以,接下来我就要告诉您,如何在只运行 Microsoft Windows? XP 的情况下编程访问 XML Web 服务。当然,我们得承认安装操作系统也构成了一个障碍,但是这有可能很快就成为一种标准,如同我们看到的所有 Windows 系统一样。
在 Windows XP 中包括了两个重要的组件,它们使您可以自己接触 XML Web 服务。第一个是 Windows 脚本宿主,该组件包括在 Windows 的所有版本之中,并且基本已成定局。另外一个是 Microsoft SOAP 类型库。它提供了必需的编程界面,以便访问 .NET XML Web 服务以及与其交互。言归正传,让我们正式开始吧。
如果您使用的是 Windows XP,请执行以下操作:
创建一个名为 Mystic.vbs 的新文本文件。
在其中输入以下 VBScript
代码:
SET scEightBall =
CreateObject("MSSOAP.SOAPClient")
scEightBall.mssoapinit
_
"http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx?WSDL"
WScript.Echo scEightBall.Ask("我这周五有约会吗?")
现在执行这个脚本文件。可以通过双击其图标或在命令行中输入以下命令来执行:
C:\> cscript
mystic.vbs
无论以何种方式执行,您都会看到针对您的问题的答案。现在您已经编写了第一个使用 XML Web 服务的应用程序。让我们看看我们做了些什么,以及它是如何完成任务的。
首先,必须找到一个能完成此目的的 .NET 服务。这也许是整个过程中最难的一步。UDDI 是一个服务目录,它是专门为定位基于 Internet 的服务设计的。缺点是它不仅仅能够列出以上述代码演示的方式使用的服务,所以我们需要谨慎地作出选择。特别要注意的是,我们要使用以 .asmx?WSDL 结束的 URI。ASP .NET 被要求在此处为所提供的 XML Web 服务提供 WSDL(Web 服务说明语言)。通过 WSDL,Microsoft Soap 类型库才能判断 XML Web 服务提供的接口是什么,以及如何与之交互。
我恰好知道 www.GotDotNet.com(英文)中有一些 XML Web 服务的示例,这些对我使用此示例提供了帮助。以下是我怎样知道上面三行代码该怎么写的:
首先我访问了 http://uddi.microsoft.com(英文),这是一个有关他们提供的各种业务和服务的内容广泛的目录。
在“Search by business
name”字段中,我输入了 GotDotNet。我还有其他搜索方法,但是我觉得这种情况下这么搜索最快。
搜索结果返回一个列表/链接:
GotDotNet(英文)
.NET 框架社团网站
这就是我所寻找的内容,所以我单击了这个链接。
于是出现了一串已经针对 GotDotNet 注册的服务,包括:
名称 | 说明 |
---|---|
.NET Resources(英文) | GotDotNet 资源中心是访问各种 .NET 框架链接目录的门户。在这里,您将找到通往许多 .NET 框架网站的链接。 |
Thumbnail Generator(英文) | 缩略图生成器 Web 服务创建指定 URL 的 .gif 图像。该服务将图像在服务器上保存预先定义的一段时间,并返回 URL 以供访问。 |
Quote of the Day(英文) | 这个示例每天返回一句有趣的言论。 |
Eightball(英文) | 八球 Web 服务模拟了我们熟悉并喜爱的八球玩具。该服务通过从一个 XML 文件中的一组标准答案中随机选择一项来完成。 |
test | 这个 Web 服务仅用作测试。这不是很有趣,但是在您需要的时候会很方便。 |
在这个列表中有两项看起来很有趣,即Quote of the
Day(英文)和Eightball(英文)。来自八球的响应每天更改不止一次,看起来似乎更有活力,所以我觉得这个选项不错,就单击了该选项。
下一个页面仍然在 UDDI 网站上,包含了更多关于八球 Web 服务的详细信息。它包含一个指向 http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx(英文)的链接。该页面是 XML Web 服务的基本 URL,也是您无畏的鼠标要单击的下一个目标。
显示的页面是单击 ASMX
文件的结果。重要的是,您要看到的不是 ASMX 文件的内容,而是由 ASP .NET 为您创建的内容。ASP .NET 查看 ASMX
文件的内容,然后创建相应的 HTML,记录 XML Web 服务及其可用的操作。在这个特殊的示例中,我们所看到的是这个服务的名称
(EightBallWS),并且它还提供了一个简单操作 (Ask)。
如果您单击了 Ask,它不仅显示有关此接口的 SOAP
说明。由此,我看出这个函数使用字符串作为输入,而提供字符串作为结果。此页面还向您提供了一个简单窗体,用于测试此服务。在输入框中输入一个问题,然后单击“Invoke”按钮,将返回一个带有实际响应
XML 的网页。
现在我知道了编写代码实现这个功能的关键。具体而言:
该服务的 URL 是 http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx(英文)。
服务的名称是 EightBallWS。
我要调用的函数是
Ask,它使用字符串作为输入参数,然后返回字符串作为结果。
让我们再看一下我的代码,一步步分析:
SET scEightBall = CreateObject("MSSOAP.SOAPClient")
这行代码创建了我要使用的 SOAP 客户端对象。
scEightBall.mssoapinit _
"http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx?WSDL"
这行代码初始化我的 SOAP 对象,并在我要使用的 XML Web 服务中指出。我也可以列出 mssoapinit 的第二个(可选)参数:应该是 EightBallWS,我要选用的服务的名称。我们得到:
WScript.Echo scEightBall.Ask("我这周五有约会吗?")
这一部分代码仅仅调用我从此服务中访问的一个方法,并将结果显示到屏幕上。
所有这些都说明,编写使用 .NET XML Web 服务的简单应用程序是多么直接了当。随着 Windows 脚本提供了一种流畅的方式促进用户和 XML Web 服务之间的编程交互,编程达到了一个真实的层面,我们都能够获得亲身体验。
出于完整性考虑,我继续完成了这个简单应用程序的编写,并且创建了一个更稳定的版本,使您可以动态输入要知道答案的问题。同时我完成了代码,这样它可以从命令行中执行或者在双击图标时直接执行。
SET scEightBall = CreateObject("MSSOAP.SOAPClient")
scEightBall.mssoapinit _
"http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx?WSDL"
Set objArgs = WScript.Arguments
DIM a
FOR i = 0 to
objArgs.Count - 1
a = a & objArgs(i) & "
"
NEXT
a = Trim(a)
DO WHILE len(a) <= 0
a
= Trim(Prompt("您的问题是什么?"))
LOOP
answer = scEightBall.Ask(a)
WScript.Echo vbCRLF & "答案是:" & answer
FUNCTION Prompt (question)
IF len(question)
<= 0 THEN question = "Input"
ON ERROR RESUME
NEXT
WScript.StdOut.Write question & ":"
IF (Err.Number = 0) THEN
Prompt =
WScript.StdIn.ReadLine
ELSE
Prompt = InputBox
(question)
END IF
END FUNCTION
值得注意的是,此服务接受一个简单的参数,并返回一个简单的值作为结果。.NET XML Web 服务可以来回传递复杂的结构和数据集,并且这些数据可以来自一个能处理复杂结构的编程语言,其操作跟我在此对 String 参数执行的操作一样简单。但是,这种复杂性超越了 Windows 脚本的一般范围,所以对于象上面这样的程序,最好坚持使用传递简单参数的 XML Web 服务。我们可以使用非常复杂的参数,但是这超出了本文所讲述的范围。
下面是一些附加的链接,您可以从中获得有关 .NET XML Web 服务以及如何进行相关编程的详细信息:
Windows XP 中的 SOAP 客户端概述(英文)
SOAP Toolkit 2.0 文档(英文)
WSDL 简介(英文)
Web 服务要素(英文)
GotDotNet(英文)