Microsoft .NET XML Web Services

Robert Hess
Microsoft Corporation

*

到目前为止,将近 5 年的时间里,我一直非常喜欢撰写这个系列的文章。在此期间,我讨论过 Web 设计问题、脚本编写、颜色理论、n 层体系结构、用户界面设计,最近为您介绍了与新的 .NET 体系结构相关的主题。希望在我不断研究和为您呈现这些文章的同时,您能喜欢阅读这些文章。但是,唉,天下没有不散的筵席,现在是我退出这个专栏的时候了。但不要担心,您还没有阅读我的最后一期呢。您仍然能够经常找到我,我会主持“.NET Show”,也会在各种开发人员活动中发言,而且我确信将来我肯定还会以 MSDN 定期文章作者的身份偶尔露露面的。到那时,咱们 Web 上再见。
Robert Hess
部门经理
平台策略部门

是啊,是啊,这些天,每个人都在谈论 XML Web Services,包括它们的一般形式,它们是通过 .NET 提供的,使用 Microsoft Visual Studio® .NET 非常容易开发,以及它们将如何成为“HailStorm”(仍是个代码名)的核心。如果您阅读过各种文档、白皮书或者媒体声明,那肯定已经被所有那些体系结构图表、业务模式研究、服务基础结构讨论以及其他相关激动人心的内容弄得头昏脑胀,现在可能都有些消化不了了吧。见鬼,在过去几个月里,我实际上一直在向您做填鸭式的灌输。但是,糟糕的是,这样做只是使您只知其然,如何才能够真正利用这些知识呢?

在本文中,我想为您提供一些非常简单的代码,这些代码演示了 XML Web Services 的简易程度,使得您即刻就可使用该服务。

对于我们任何一个具有较长时间计算机背景的人来说,都会记得那些早期的日子,那时好像存在各种各样的竞争计算机系统。我说的不是那些大学拥有的大型计算机,也不是数据处理业务,而是家用计算机。Apple、IBM、Texas Instruments、KayPro、Commodore、Timex、Radio Shack,甚至 Mattel 都在生产各种大小和形状的 个人电脑。针对为什么一个公司比另一个公司更成功,存在着各种说法,但是我仍然记得那时自己的心情。

那时我想了解、尝试各种各样的计算机,让人合意的计算机是那些从一个编程人员的角度来看,能够立即发挥功能的计算机。我说的是那些除了能够运行预打包的程序(通常为游戏),还能执行更多任务的计算机。对我来说,那些绝妙的计算机就是无需购买任何附加硬件或软件,可以让我坐下来编写一些自己代码的计算机。我可以编写的程序不会受到人为限制,但是能够真正访问计算机的方方面面。 才是一台超炫的计算机。

我的第一台计算机是一台 TI 99/4A。按照计算机那时的标准,它确实很酷 — 配备了内置 BASIC、彩色显示器以及可编程屏幕字体。但是,内置的 BASIC 非常有限。为了以汇编语言编写程序,不但必须购买附加的开发软件,还得购买扩展内存模块 (EMM),任何想运行您的程序人也必须购买 EMM。进入历史舞台很短的一段时间之后,这个 TI 最终逐渐淡出。我的下一台计算机是一台 Apple //c,这是一个功能完整的计算机,可以以 BASIC 或汇编语言进行编程,并且具有足够的小指令来访问内置到固件的低级功能。这些都是现成的,无需购买其他必要东西。

所有这些都强调了我认为对于技术成功 来说很重要的一个方面,那就是宽广和通用的可用性和可访问性,无需为了喜好的特殊用途而购买硬件、软件或其他东西。让某个技术对于普通人员来说可访问并且有用,那么它就有更大机会真正发挥作用。对于 XML Web Services,又如何能够做到上述这一点呢?

虽然我可以高谈阔论 XML Web Services 如何如何好,但是如果您自己不亲自 接触 它们,进行各种软件安装实际操练的话,一切就都是虚的。因此,我将向您演示,在运行的版本最高为 Microsoft Windows® XP 的情况下,如何能够以编程的方式访问 XML Web Services。虽然这样肯定会为我们设置一个安装壁垒,但这个版本有希望在短时间内呈现所有 Windows 系统上将要看到的一般情况。

Windows XP 中包括了两个非常重要的组件,使您能够亲自接触并使用 XML Web Services。第一个为 Windows Script Host,其中目前已经包括在了几次发布的所有 Windows 版本中,几乎已经被认为是理所应当包括的组件。另一个是包括了 Microsoft SOAP 类型库。此组件提供了用来访问 .NET XML Web Services 以及与之进行交互所必需的编程接口。罗嗦了半天,现在我们切入正题吧。

如果您正在运行 Windows XP,则请执行下列操作:

1.

创建一个新的文本文件,将其命名为 Mystic.vbs

2.

向其中输入下列 VBScript 代码:

SET scEightBall = CreateObject("MSSOAP.SOAPClient")
scEightBall.mssoapinit _
   "http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx?WSDL"
WScript.Echo scEightBall.Ask("Will I have a date this Friday?")

3.

现在执行该脚本文件。通过双击其图标,或者在命令提示符下键入下列命令,即可执行该文件:

C:/> cscript mystic.vbs

使用这两种方式,您都应该看到返回一个响应,上面带有您的重要问题的答案。现在您就编写了使用 XML Web Services 的第一个应用程序。我们来快速了解一下我们做了哪些操作,以及它是如何完成此任务的吧。

首先,很重要的一点是要找出适用于此目的的一个 .NET 服务。这可能是整个过程中最难的部分。UDDI 是一个服务目录,它用于寻找基于 Internet 的服务。它的一个缺点在于,不会只列出我们可以上述代码演示的方式进行使用的服务,因此我们必须仔细作出选择。尤其重要的是,我们最终要找到一个结尾为 .asmx?WSDL 的 URI。在这个 URI 中,会请求 ASP .NET 为要提供的 XML Web Service 提供 WSDL(Web 服务描述语言)。Microsoft Soap 类型库是通过 WSDL 来判断 XML Web Service 的公开接口,以及与其进行交互的方式的。

我碰巧知道 www.GotDotNet.com 有一些 XML Web Services 公开的示例,这些示例帮助我找到了在此示例中用到的一些内容。下面的内容讲述了我是如何逐步进行操作,最终了解了上述三行代码需要成为什么样子的:

首先,我进入了 http://uddi.Microsoft.com,这是一个范围较广的目录,其中列出了各种业务,以及它们所提供的服务。

Search by business name 字段中,我输入了 GotDotNet。还有很多其他方式可以用来执行此搜索,但是这个方式对于这种特定的情况来说最为简单。

搜索结果返回下列内容的列表/链接:

GotDotNet

The .NET Framework Community Web 站点

这个网站当然就是我要找的网站,很自然,我单击了此链接。

此链接显示了已经在 GotDotNet 中进行了注册的服务列表,其中包括:

名称说明

.NET Resources

GotDotNet 资源中心是一个带有各种 .NET 框架链接目录的门户。在此门户中,您会找到到很多 .NET 框架网站的链接。

Thumbnail Generator

Thumbnail Generator Web 服务可创建指定 URL 的 .gif 图像。该服务会在服务器上存储该图像,在一个预先指定的时间长度之后,就会返回可访问该图像的 URL。

Quote of the Day

此示例每天会返回一个有趣的新言论。

EightBall

EightBall Web 服务会模仿我们都非常熟悉和喜欢的著名八球玩具。它通过从 XML 文件中的一些标准答案中随机选择其中一个来执行上述操作。

此列表上比较有趣的是 Quote of the Day 和 EightBall。因为 EightBall 返回的响应每天会更改几次,好像更加动态一些,所以我认为这是一个很好的选择,于是单击了这个链接。

接下来的这个页面仍然在该 UDDI 网站上,其中包含了有关 EightBall Web 服务更详细的信息。它包括了一个到 http://www.gotdotnet.com/playground/services/eightball/EightBallWS.asmx 的链接,这是 XML Web Service 的基本 URL,是您的无畏鼠标要点击的下一个目标。

接下来显示的页面是单击 ASMX 文件的结果。要注意的重要一点是,您将要看到的不是 ASMX 文件的内容,而是 ASP .NET 为您创建的内容,ASP .NET 对 ASMX 文件的内容进行了解析,并创建了相应的 HTML,其中主要记录了该 XML Web Service 及其可用操作。这个特定的情况下,我们看到的列表为此服务的名称 (EightBallWS),以及它提供的一个单一操作 (Ask)

如果要单击 Ask,它则不但会显示此接口的 SOAP 说明,还会显示其他内容。从这些内容,我可以看出,此函数采用字符串作为输入,并提供字符串作为结果。此页还提供了一个简单的表单,您可以用来测试此服务。在输入框中输入一个问题,然后单击 Invoke 按钮,则会显示一个 Web 页,上面带有真正响应的 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 Service。我还可以向 mssoapinit 列出第二个(可选)参数,这个参数应该是 EightBallWS(我要与之连接的服务名称)。这样会为我们显示:

WScript.Echo scEightBall.Ask("Will I have a date this Friday?")

这个代码段只是调用我要从此服务访问的这个方法,并在屏幕上显示结果。

所有这些说明了,编写一个使用 .NET XML Web Service 的简单应用程序是如此的简单,令人吃惊。Windows Scripting 提供了一种在用户和 XML Web Services 之间进行程序化交互的极佳方式,从而使得编程级别下降到了一个我们都可以直接进行体验的真实层面。

出于完整性方面的考虑,我继续了这个简单应用程序的开发,并创建了一个更为可靠的版本,使您能够动态输入您的问题,获取您想要的答案。我已经完成了此代码,无论从命令行执行还是直接双击图标,该代码都能正常运行。

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("What is your question?"))
LOOP

answer = scEightBall.Ask(a)

WScript.Echo vbCRLF & "The Answer Is:" & 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 Services 与能够本地处理复杂结构的编程语言之间,还可以来回传递复杂的结构和数据集,这种传递与此处演示的利用 字符串 参数进行传递一样简单。但是,这种复杂程度超出了 Windows Scripting 的一般范围,因此对于类似上面的程序来说,最好坚持那些使用简单参数的 XML Web Services。使用更复杂的参数是可行的,但是不在本文讲述范围之内。

下面是一些附加链接,可用于了解有关 .NET XML Web Services 的更多信息,以及如何使用这些服务来进行编程:

Windows XP 中的 SOAP 客户端概述

WSDL 简介

Web 服务开发人员中心

GotDotNet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值