XML Web Service
Microsoft? .NET Framework 最令人激动的一点是包含了可扩展标记语言 (XML) Web Service。Web 服务允许应用程序间以基于标准的方式来通信和交换信息。Microsoft 的 Web 服务的实现有许多内在的好处。使用超文本传输协议 (HTTP) 和传输控制协议/Internet 协议 (TCP/IP),可以以 XML 格式交换信息。因此,Web 服务使用现有结构,可以在现有环境中方便地实现。
本文中,我们将使用 Microsoft GotDotNet Web 站点上的 EightBall Web 服务。我们将创建一个 Web 页,该页将向 EightBall Web 服务发送请求。EightBall Web 服务将接受并处理请求,并发回一个响应,可以在我们的 Web 页上显示该响应。这个使用 Web 服务的响应的过程就是所谓的“使用”Web 服务。
使用 Web 服务的要求
要使用 Web 服务,必须具有几个组件。如果您使用的是 Microsoft Visual Studio? .NET,那么这些组件会自动安装到合适的位置。而为了实现本文的目标,我们将采用 Microsoft FrontPage? 的 Web 站点创建和管理工具来使用 Web 服务。
要利用 FrontPage 来使用 Web 服务,您需要具备:
1 Microsoft .NET Framework 软件开发工具包 (SDK)
2 Microsoft Internet Information Services (IIS,Windows? 2000 Server 操作系统内置的 Web 服务器)
3 Web 服务代理
4 ASP.NET Web 窗体
Microsoft .NET Framework SDK
Microsoft .NET Framework 提供了用于 Microsoft .NET 平台的编程模型。它允许我们创建完善的 Web 服务和应用程序。.NET Framework 允许创建 ASP.NET 页,该页是使用 EightBall Web 服务时所必需的。要完成本文所述的这些步骤,您需要具有 .NET Framework SDK。
Microsoft Internet Information Services
我们必须具有 Web 服务器,而且 Web 服务器必须支持 ASP.NET。可以在 Windows 2000 或 Windows XP 上使用 Microsoft Internet Information Services。可能还需要安装必要的安全更新。
如果在安装了 .NET Framework SDK 之后安装 IIS,您需要运行 .NET Framework 目录中的 Aspnet_regiis.exe 来安装 ASP.NET 支持。
Web 服务代理
客户端和 Web 服务之间使用简单对象访问协议 (SOAP) 消息来通信。详细信息请参阅 SOAP 站点。Web 服务代理负责形成 SOAP 消息并通过网络发送这些消息。这使得使用 Web 服务异常容易,因为无需将参数映射给 XML 元素。Web 服务代理包括本地 Web 服务器上的动态链接库 (DLL)。使用 .NET Framework SDK 附带的名为 WSDL.exe 的实用程序,可以生成 Microsoft Visual Basic? .NET 或 C# 的源代码文件,然后使用该文件来编译 Web 服务代理。这是非常容易实现的,稍后我们将进行更加详细的说明。
ASP.NET Web 窗体
我们需要为用户提供一种向 EightBall 服务提问的方式。我们将使用 ASP.NET Web 窗体来实现这一目的。因为 FrontPage 不具备在用户界面中生成 ASP.NET 组件的能力,我们将在 HTML 视图中通过手动编码生成 Web 窗体。
为使用 Web 服务做准备
如果您已经安装了 Microsoft .NET Framework SDK 和 Internet Information Services,我们就可以马上探究如何使用 EightBall Web 服务了。以下是使用 Web 服务需要采取的步骤:
1. 检查 Web 服务。
2. 生成源代码文件。
3. 编译 Web 服务代理。
4. 设计 ASP.NET 界面。
5. 连接 Web 服务。
6. 复制代理。
7. 测试 ASP.NET 应用程序。
检查 Web 服务
为了检查 Web 服务和查看其提供的信息类型,我们浏览到 Web 服务入口点。该特定 Web 服务的链接是 http://www.gotdotnet.com/playground/services/EightBall/eightballws.asmx。如果您浏览至该 URL,将会看到该 Web 服务所支持的操作的列表。本例中,您将会看到指向 Ask 操作的链接。
图 1:用于 Ask 操作的 HTTP Post 信息
如果单击指向 Ask 操作的链接,将会看到 SOAP 请求和 Web 服务响应的实例。如果检查该请求和响应,将会发现 Ask 操作要求传递给它一个字符串(注意 HTTP POST 段中的“psQuestion=string”文本)并返回一个字符串。该页上包括一个文本框,可以在其中键入问题并接收来自 EightBall Web 服务的 XML 格式的回答。
要在 FrontPage 中设计界面来使用该 Web 服务,需要使用该信息。通过检查 Web 服务入口点的信息,我们断定需要设计一个窗体,窗体上要有一个文本框用于输入问题,并且要有一个按钮用来向 Web 服务提交问题。然后需要提供一个页面元素来包含从 Web 服务返回的回答。以后我们将深入讨论。现在,我们需要生成源程序代码,用来编译 Web 服务代理类。
生成源代码文件
用于 Web 服务的实际 .NET 程序集驻留在装载了该 Web 服务的 Web 服务器上。然而,客户端的代理类负责为 Web 服务创建格式正确的 SOAP 请求。因此,我们需要在本地 Web 服务器上创建充当代理类的 .NET 程序集。使用 Microsoft 的 .NET Framework SDK 中提供的工具可以很容易地完成此操作。
要生成代理类的源代码文件,我们将使用 Web 服务说明语言实用程序,即 WSDL.exe。您可以在安装了 .NET Framework SDK 的目录中找到该实用程序。(默认情况下,该实用程序将被安装在 c:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin 文件夹中。)WSDL.exe 允许我们为代理类创建源文件。
生成源文件之前,请在驱动器 C 的根目录中创建一个用于 Web 服务文件的目录。将该目录命名为 8Ball。创建该目录后,我们就可以生成使用 EightBall Web 服务所必需的文件了。
要生成源代码文件:
1. 单击“开始”,指向“程序”,指向“附件”,单击“命令提示符”打开命令提示符窗口。
2. 转到包含 WSDL.exe 实用程序的目录。
3. 在命令行中键入以下内容,然后按 ENTER 键:
wsdl /l:VB /o:c:\8ball\8ball.vb
http://www.gotdotnet.com/playground/services/EightBall/eightballws.asmx?wsdl
在 WSDL.exe 中使用下面的开关来生成源文件:
/l - 此开关指定源文件的语言。本例中,我们指定 Visual Basic 语言。也可以指定 CS (C#) 语言,这将生成 C# 源文件。
/o - 此开关指定输出文件的名称。Visual Basic 源文件应该具有 .vb 文件扩展名。C# 源文件应具有 .cs 文件扩展名。
注意:使用 /? 开关可以获得关于 WSDL 的详细信息。
传递给 WSDL 的 URL 是指向 Web 服务合约的 URL。Web 服务合约是一个文档,列出了应该提供给该 Web 服务的信息类型和它将返回的信息类型。Web 服务合约的 URL 就是在 Web 服务入口点 URL 末尾附加 ?wsdl。
现在我们已经成功地生成了用于编译 Web 服务代理类的 Visual Basic .NET 源代码文件。
编译 Web 服务代理
创建 Visual Basic .NET 源文件后,我们需要将其编译进 Web 服务代理中。要这样做,我们将使用随 .NET Framework SDK 附带的 Visual Basic .NET 编译器。
要编译代理类,请在打开的命令提示符下键入:
Vbc /t:library /out:c:\8Ball\8BallClient.dll
/r:System.dll /r:System.XML.dll /r:System.Web.Services.dll c:\8Ball\8Ball.vb
我们使用以下的开关来生成代理类:
/t - 此开关指定要生成的程序集类型。本例中,我们要编译 DLL 文件,所以指定程序集类型为 library。
/out - 此开关指定输出文件的名称。因为我们指定了 library 的程序集类型,因此输出文件名称必须具有 .dll 文件扩展名。
/r - 此开关指定程序集的引用。本例中,我们引用三个 Microsoft .NET 命名空间,所有的 Web 服务代理客户端都需要这三个命名空间。它们是 System、System.XML 和 System.Web.Services 命名空间。
编译器完成代理类的编译后,驱动器 C 的 8Ball 目录中就有了名为 8BallClient.dll 的文件。这就是代理客户端。稍后我们将把它移动到正确的位置。您可以关闭命令提示符窗口,我们将继续创建用于与 EightBall Web 服务进行交互的界面。
设计 ASP.NET 界面
现在我们已大体了解了需要创建的界面,并且已成功编译了 Web 服务代理类。下一步是创建 ASP.NET 窗体,用于与 EightBall Web 服务交互。
设计 ASP.NET 界面之前,需要创建一个 FrontPage 项目。创建新的单页 Web 站点并命名为 8Ball。必须在安装了 ASP.NET 的 Web 服务器上创建该站点,这点很重要。
创建了 8Ball 站点后,需要确保将其标记为应用程序的根。步骤如下:
1. 单击“开始”,指向“设置”,单击“控制面板”来打开控制面板。
2. 双击“管理工具”。
3. 双击“Internet 服务管理器”(Windows 2000) 或“Internet Information Services”(Windows XP Professional)。
4. 展开“默认 Web 站点”节点,以便看到 8Ball 站点。(在 Windows XP Professional 中,您需要展开“Web 站点”节点来找到“默认 Web 站点”节点)
5. 右键单击 8Ball 节点并选择“属性”。
6. 将打开“属性”对话框,并显示“目录”选项卡。如果没有,请单击“目录”选项卡。
7. 在“应用程序设置”部分中,单击“创建”按钮将该站点设为应用程序的根。
8. 单击“确定”。
该 Web 站点现在已成为应用程序的根,我们可以继续创建 ASP.NET 用户界面了。
用户界面中将使用三个 ASP.NET Web 窗体控件。TextBox 控件用于输入 EightBall Web 服务的问题,Button 控件用于初始化对 Web 服务的请求,而 Label 控件用于显示从 Web 服务收到的回答。所有这些控件都包含在 ASP.NET 窗体中。
使用 Microsoft Visual Studio .NET 来设计 Web 窗体非常容易,只需要拖放窗体元素并在用户界面中设置这些元素的属性即可。本例中,我们没有使用 Visual Studio .NET,所以不得不通过手动编码生成窗体元素。
创建 Web 窗体
需要做的第一件事是创建 Web 窗体自身的代码。如果您熟悉超文本标记语言 (HTML) 的窗体代码,那么对该代码也一定很熟悉。打开 8Ball 站点的主页并切换到 HTML 视图。在现有的 标记中键入以下代码:
<form runat="server"></form>
除了添加了 runat 属性以外,该代码与 HTML 窗体完全相同。runat 属性的值是 server,表示该窗体是 ASP.NET 服务器控件。这是 ASP.NET 的简单性的一个非常完美的示例。要使 HTML 元素成为 ASP.NET 服务器控件,只需添加 runat 属性并将其值设置为 server。
此时,应保存本页面并继续以下步骤。将页面保存为 8ball.aspx。
添加 ASP.NET Web 窗体控件
创建窗体后,需要添加 ASP.NET Web 窗体控件。
首先,添加 TextBox 控件。这是 Web 页用户输入 EightBall Web 服务问题的地方。要添加 TextBox 控件,请在开始和结束
标记之间添加以下代码:
<asp:TextBox id="tbQuestion" runat="server"/>
如果您从来没有在 ASP.NET 中进行过编码,该代码对您来说可能很陌生。附加到控件名称之前的 asp: 表示这是一个 ASP.NET Web 窗体控件
将其余代码添加到页面中,窗体代码将如下所示:
<form runat="server">
<asp:TextBox id="tbQuestion" runat="server"/>
<asp:Button id="btnGo" runat="server"
Text="Submit Question" onClick="getAnswer"/><br><br>
<asp:Label id="lblAnswer" runat="server"/>
</form>您可能注意到在 FrontPage 的普通视图中看不到这些控件。这正是所希望的,因为这些是 ASP.NET Web 窗体控件,FrontPage 不能显示它们。
连接 Web 服务
如果复查已经添加的代码,会发现当单击按钮时,调用了名为 getAnswer 的过程。这是服务器端的过程,负责:
创建代理客户端类的实例。
调用 EightBall Web 服务的 Ask 函数并向其传递我们的问题。
设置 Label 控件的文本以便显示从 Web 服务收到的回答。
要创建该程序,在页面中 结束标记前添加以下代码:
<script runat="server">
Sub getAnswer(sender as Object, e As System.EventArgs)
Dim clsEightBall As EightBallWS = New EightBallWS
Dim strAnswer As String
strAnswer = clsEightBall.Ask(tbQuestion.Text)
lblAnswer.Text = strAnswer
End Sub
</script>
大致地检查该代码。
<script> 标记是一个基本脚本标记,但向其添加 runat="server" 以后便可以在服务器上处理它。然后定义 getAnswer 过程。请注意这个程序需要两个参数:sender 和 e。这是 Microsoft .NET 事件处理程序所需要的签名。
接下来,创建代理客户端类的实例。我们怎么知道该类名为 EightBallWS?使用记事本检查用 WSDL 创建的 Visual Basic 源文件,会看到以下代码:
Public Class EightBallWS
每个代理类都有一个与其相关的名称,并且就是创建该类的新实例时所使用的名称。我们称 EightBallWS 类的实例为 clsEightBall。该名称是任意选择的。
接下来,创建一个字符串值 (strAnswer) 来容纳 Web 服务返回的回答。请记住我们之前检查过 Web 服务,并曾确定有一个名为 Ask 的操作,该操作接受字符串参数并返回一个字符串。
然后,通过调用 Web 服务的 Ask 操作并将我们的问题传递给该操作,为 strAnswer 赋值。
strAnswer = clsEightBall.Ask(tbQuestion.Text)
将问题传递给 Ask 操作的方式是:将之前创建的 TextBox Web 窗体控件 (tbQuestion) 的 Text 属性传递该操作。我们已经知道 Web 服务的 Ask 操作将答案作为字符串传回给我们。因此,执行了上面的行后,strAnswer 将包含从 Web 服务返回的问题答案组成的字符串。
剩下要做的事情就是显示我们检索的答案。要完成此操作,需要将 strAnswer 中包含的值赋给 Label 控件的 Text 属性。
lblAnswer.Text = strAnswer
现在保存该页面。确保页面保存为 8ball.aspx。
复制代理类
测试新的 ASP.NET 页前要做的最后一步是,将已编译的代理类复制到 ASP.NET 应用程序中正确的位置。
1.在 FrontPage 站点中创建新文件夹并命名为 bin。
2.将之前编译的 8BallClient.dll 文件导入到该文件夹。
测试 ASP.NET 应用程序
现在我们可以测试 ASP.NET 应用程序了。浏览到 8ball.aspx 页面。您会看到一个文本框和一个按钮。在文本框中输入问题并单击按钮。您将看到文本框下方会显示来自 Web 服务的响应。
图 2:操作中的 EightBall Web 服务
小结
在本文中,我们创建了一个非常简单的 ASP.NET Web 窗体,以通过 Microsoft FrontPage 使用 Web 服务。我们已经展示了 XML Web Service 体系结构的优点,并说明了通过访问 Web 服务入口点来查找关于 Web 服务特定信息的方法。
使用简单的 Web 服务(例如 EightBall Web 服务)是非常容易的。如果希望使用复杂的 Web 服务,您可能需要考虑使用 Microsoft Visual Studio .NET,因为它提供了强大的工具集,可用于使用 Web 服务,并可以在所见即所得 (WYSIWYG) 的环境中设计 ASP.NET Web 窗体。