实现Web Service



  Visual Basic 6中的COM可以让我们通过仅仅几行代码在一个独立的文件中(可能是DLL或EXE)运行软件。后来,我们又有了更多的技术和DCOM,可以使我们在其他的机器上通过仅仅几行代码在一个独立的文件中运行代码。

  在VB.NET中,我们又得到了Web Service,它是DCOM的有效延伸。Web Service允许用户通过互联网、内部网,或在同一台机器上调用方法或函数,并返回相应的结果。在VB.NET中,应用软件和DCOM之间的联系再也无须象在VB6中那样紧密了,我们只需发现Web Service的用处,然后使用它即可,而无需在GUID、类型库、注册等方面浪费时间。

  在本篇稿子中,我们将首先建立一个Web Service,然后让应用程序调用它。现在让我们立即开始吧。

  假想

  想象一下我们可以通过Web Service做什么。也许可以通过在网站上添加Web Service获得产品的可用性,这将使开发人员简单地调用Web Service函数,并在应用中使用返回的结果。

  可能你不与产品打交道,而希望获得包裹跟踪信息、股票行情、利率、天气预报、拍卖品资料等,甚至还可以用来获得订单。因此,Web Services的用处非常大,也非常容易使用。

  由于它如此简单,下面我们将立即着手建立相应的应用程序:

  ·在VB.NET中创建一个新的Web Service工程。


   图:Services Rendered1

  在经过适当的处理后,屏幕上将显示Design模式下的Service1.vb。Web Service没有可视化模式,尽管可 以在其中使用一些控制,强化Design模式界面。

  下面我们进入代码模式:

  ·双击[Design]模式下Service1.vb窗口的任一处,将会转入核心的代码窗口。

  提示:在处理Service1.vb文件时,在Solution Explorer中也就选定了Service1.asmx文件。该.asmx文件是互联网服务的真正路径,.VB文件是它的代码。

  我们会注意到在屏幕上会显示许多预生成的代码,其中包括一个HelloWorld样例函数。我们不运行其中的例子函数,我们将迅速地编写出自己的代码。

  ·在HelloWorld例子下添加下面的代码:

Public Function ReverseName(ByVal Name As String) As String
ReverseName = StrReverse(Name)
End Function

  这一函数与正常的函数的区别是其中的标记,它能够使VB.NET将这一函数作为Web Service的一部分。
这一函数仅仅实现对Name参数的反转,没有其他别的功能。

  提示:除了Function后面跟参数这种方式外,还可以使用Function后面不带参数,Sub后面带参数或者不带参数等多种形式来定义函数。

  ·保存工程。

  ·选取菜单上的Build项编译设计的互联网服务。

  ·在Solution Explorer中右击Service1.asmx文件,并选择View in Browser选项,这将使我们无需妄动浏览器,从而省下一些麻烦。

  这一网页就会自动产生,并起着你设计的互联网服务的用户界面的作用。普通用户并非要使用这种方法来访问数据,但对于 开发人员使用它来验证信息的有效性时,这就是一个比较好的方法。


    图:Services Rendered2

  ·阅读ReverseName函数所提供的信息。

  ·提供一个Name参数,并点击Invoke按钮。

  在我的机器上,我在一个新的窗口中得到了如下的返回信息:


erooM lraK

  由于机器配置和名字的不同,你得到的返回信息可能会与我有所不同。

  应该注意的是,在这里返回的是XML。XML是“存储关系数据”的一种方法,与HTML的书写方式在结构上很类似。

  提示:Web Service是通过SOAP起作用的。SOAP是简单对象访问协议的缩写,是通过HTTP协议进行通讯的一种基于XML的协议。

  避开技术细节问题,我们可以发现在XML内部返回的字符串是erooM lraK,正好是Karl Moore字符串的反转。因此Web Service是有效的,我们已经创建了一个函数并通过Web界面对它进行了访问,我们也看到了它返回的XML格式的结果。但我们如何在实际生活中使用它呢?

  现实生活中的Web Service

  尽管我们已经知道了如何创建一个简单的互联网服务,并通过Web界面访问它,但这对我们在现实生活中的帮助并不大,是吗?

  下面,我们来创建一个对我们有较大帮助的应用程序:

  ·在VB.NET中创建一个新的Windows Application。


    图:Services Rendered3

  提示:并非只有Windows Application类的应用程序才能使用Web Service,也可以将这种技术与Web Form结合使用,甚至可以在Web Service中使用Web Service,创建使用了使用Web Services创建的Web Services的Web Services。

  ·在Form1上添加一个Button。

  ·将其Text属性改变为:Get that Groovy Value, Cowboy!。

  现在,我们需要为我们设计的Web Service添加一个“引用”。

  ·依次选择Project->Add Web Reference。

  ·在Address文本框处输入我们的Web Service的地址。

  例如,我在Address文本框处输入了:http://abydos/WebService1/Service1.asmx

  这一地址除显示我们曾看到过的同一个网页,还将包括一个独立的使我们能够浏览协议和文档的面板,这就是发现阶段的全部。

  ·点击Add Reference按钮。

  现在我们添加一些可以利用添加的Web Service的代码:

  ·双击Button。

  ·在其Click事件中添加如下所示的代码:

Dim objTest As New abydos.Service1()
MessageBox.Show(objTest.ReverseName("Karl Moore"))

  也许在这里你会改变机器的名字,但核心的代码不会因此而改变。我们在Abydos服务器上创建了Service1的一个新实例,然后运行ReverseName函数,向它传递字符串“Karl Moore”(或其他字符串),并在MessageBox中显示返回结果。

  提示:可能会注意到objTest还有许多其他的功能,而不只有我们使用的ReverseName互联网方法。

  ·击F5键测试我们的应用程序。

  

   图:Services Rendered4

  注意应用程序是如何运行的,是如何调用Web Service和返回结果的?要做到这一点并不难,XML可以很方便地为我们做到这一点。

  尽管在本例中我们使用了本地的Web Service,但我们可以从任何地方返回任何结果,这也正是Web Service的优势所在。

  但是否会出现在VB6的COM和DCOM应用程序中曾经出现过的兼容性等问题呢?在VB.NET中,这些问题都不会出现。无论在现有的方法上添加新的函数还是新的参数,它一点都不会影响我们的应用程序。只有在改变应用程序使用的函数的名字时,才会收到一个出错信息。当然,如果完全删除掉Web Service,那将引起严重的错误。

  我们可以进行进一步的实验,添加正在运行的外部Web Service的引用,例如在http://uddi.microsoft.com/vs.asp上的Web Service,然后创建测试应用程序。

  此外,还可以建立更复杂的服务,并让网络上的其他机器使用它们,它的简单性将使你感到吃惊。

  结论

  Web Service是VB.NET中更灵活的DCOM,它带来的进步是革命性的。在上面的稿子中,我们创建了简单的Web Service,然后在应用程序中发现并使用了它。希望读者能够充分理解这种技术,建立自己的服务,并明白其工作原理。