实现COM组件向Web Services的转变

发表于:2008-02-02来源:作者:点击数: 标签:COM组件
微软的.NET 开发 平台已经发布好长时间了,我们现在需要放弃以前编写的组件而转到 VB .NET和C#吗?答案是否定的。我们既不需要放弃以前的组件,反而可以加以利用。大多数程序开发人员要从以前的开发环境迁移到VB.NET和C#是需要付出一定的代价的。然而,为了保

微软的.NET开发平台已经发布好长时间了,我们现在需要放弃以前编写的组件而转到VB.NET和C#吗?答案是否定的。我们既不需要放弃以前的组件,反而可以加以利用。大多数程序开发人员要从以前的开发环境迁移到VB.NET和C#是需要付出一定的代价的。然而,为了保持现存程序的兼容性,仍然需要使用VB6。值得庆幸的是,微软的SOAP开发工具Simple Object Aclearcase/" target="_blank" >ccess Protocol (SOAP) Toolkit给了我们一个既可以利用以前的我们用VB6编写的ActiveX DLL,又可以利用Web Services的给我们带来的好处,它可以让我们的组件作为一种服务通过SOAP在WEB上使用。  SOAP为我们编写分布式的应用程序提供了方便,我们可以利用它以一种平台无关和位置无关的方式来调用组件。SOAP客户端向服务器发送请求信息,要求执行组件的功能,服务器处理发送的请求,执行我们需要的函数,然后把执行结果以响应信息发送到客户端。这些消息都是XML格式的,而且可以以多种协议在客户端和服务器之间进行传输,我们就以最常用的HTTP协议做为例子。

  SOAP利用HTTP作为传输机制能够让我们创建的应用程序不但可以是本机的,还可以是局域网的,还可以是因特网的。由于XML是平台无关的,因此我们写的应用程序可以在WindowsUnix,以及手持或无线设备上应用。 现在我们就看看如何把我们的ActiveX DLL通过SOAP ToolKit转换成Web Services。调查是因特网上最常见的一项内容,我们就把调查作为一个组件,能够让其它应用和网页使用,调查组件TestServey实现三个函数:RequestSurvey,RespondToSurvey和SurveyResults。

  打开Visual Basic6.0,新建一个ActiveX DLL工程,名为TestSurvey,VB6会自动添加一个名为Class1的类,把它更改为Survey,工程属性如下图所示:

  

  然后输入下面的代码:

  Option Explicit

  Public Function RequestSurvey(intSurveyID As Integer) As String

  Dim strSurvey As String

  '只是简单的例子

  strSurvey = "您认为Web Services能够对IT产生革命性的影响吗?"

  RequestSurvey = strSurvey

  End Function

  Public Sub RespondToSurvey(intSurveyID As Integer, blnAgree As Boolean)

  '这里写把调查保存到数据库的代码,为节省篇幅,做为例子,这里省略了代码。

  End Sub

  Public Function DisplaySurveyResults(intSurveyID As Integer) As String

  Dim strSurveyResults As String

  '只是简单的例子

  strSurveyResults = "共有20人投票,16人赞同,4人不赞同。"

  DisplaySurveyResults = strSurveyResults

  End Function

  RequestSurvey函数根据调查的ID号返回调查的问题,RespondToSurvey函数是把调查结果保存到数据库。

  DisplaySurveyResults函数用来返回调查结果。最后进行编译,生成TestSurvey.dll。

  下面,打开SOAP ToolKit,如果没有安装,可以到http://download.microsoft.com/download/xml/Install/3.0/W982KMeXP/EN-US/SoapToolkit30.EXE免费下载。从“开始”菜单里运行“SOAP Toolkit's Web Services Description Language (WSDL) generator”:开始|程序| Microsoft Soap Toolkit Version 3 | WSDL generator,然后按照向导进行操作。首先出现一个欢迎窗口,如下入所示:

  

  点击“Next”按钮,出现如下的页面:

  

  上图可以允许我们选择一个配置文件,配置文件允许我们能够重新装载或改变我们以前用生成器生成的组件的设置信息,这对为组件添加新的方法或从不同的服务器移除组件时很有用,这里我们什么也不选。点击“Next”按钮,出现下面的窗口,要求输入Web Services的名字和dll文件的位置:

  

  我们输入Web Services的名字为TestSurvey,选择我们编译的TestServey.dll的位置,点击“Next”按钮,出现下面的窗口:

  

  要求我们选择我们要作为Web Services的类和方法,我们把TestSurvey类的方法全部选择。然后点击“Next”按钮,出现下面的窗口,要求我们选择要进行监听的服务器地址和来自SOAP客户端请求的监听方式。

  

  点击“Next”按钮,将会出现下面的窗口,允许你输入WSDL使用的一些URL地址:

  

  点击“Next”按钮,该向导将会允许你输入要新文件存放的路径和配置文件存放的路径,如下所示:

  

  然后点击“Next”按钮,再点“Finish”即可完成。该SOAP生成器自动生成四个文件保存你前面输入的所有的值:TestSurvey.wsdl、TestSurvey.wsml、TestSurveyClient.wsml、TestSurvey.asp和一个配置文件TestSurvey.WGen。

  下面,我们需要对向导创建的结果进行测试,其中的TestSurvey.asp文件包含了调用Web Services的方法,TestSurvey.wsdl文件是供局域网之外的壳户端使用的XML定义,一个能够使用SOAP的客户端要使用你的Web Services,就必须能够理解能够使用的方法和参数。TestSurvey.wsdl文件说明了以XML格式使用你的Web Services进行请求和响应的定义。SOAP Toolkit3.0生成2个WSML文件,TestSurvey.wsml识别testServey的ProgID,同时也包含了WSDL文件中请求信息和COM接口的映射,TestSurveyClient.wsml包含了任何比较复杂的数据类型映射,如果定义了复杂的数据类型,这个文件才会用得到。

  WSDL文件把你的所有方法分解成单独的请求和响应的信息元素,在SOAP中,客户端向Web Services发送请求,其中提供名字属性,包含类名、方法名,这个文件还包含Survey.RequestSurvey请求信息元素,这些信息通过包含DLL中的类名、方法名由SOAP生成器自动生成。当它接收到请求信息时,服务器执行Web Services的功能,并返回响应结果。名字元素基本上和请求信息一致,SOAP生成器自动加上“Response”的后缀,例如:对RequestSurvey方法的响应会对应成Survey.RequestSurveyResponse。

  SOAP生成器为每个参数指派为一个XML的part元素,把name属性和我们的DLL函数里的参数匹配起来,生成器还把参数类型翻译成SOAP中同等的数据类型。生成器在创建WSDL文件时只是简单地映射数据类型,如果不能够映射方法中的某些参数时,就会用7个问号“?”来代替。下图就是SOAP数据对象和VB6数据对象的映射关系:

  

  下面,我们创建虚拟目录,以便我们刚才创建的文件能够被Internet Information Server (IIS) Web服务器使用。打开Internet服务管理器,利用创建向导创建虚拟目录,别名与我们在WDSL里指定的一样,物理目录指向我们保存新文件时指定的目录。虚拟目录创建好了以后,我们就可以对我们的Web Services进行测试了。

  现在,我们创建一个简单的SOAP客户端来使用我们的Web Services。打开Visual Basic6,新建“标准EXE”工程:

  Option Explicit

  Private Sub Form_Load()

  Dim soapClient As Object

  '创建SOAP Client的实例

  Set soapClient = CreateObject("MSSOAP.SoapClient30")

  '初始化SOAP客户端

  Call soapClient.mssoapinit("http://localhost/soaplisten/testsurvey.wsdl","TestSurvey")

  '现在soapClient对象引用了我们的Web Services,我们就可以调用我们的方法了,我们以调查ID=1为例子:

  lblSurveyQuestion.Caption = soapClient.RequestSurvey(1)

  Set soapClient = Nothing

  End Sub

  当用户点“投票”按钮时,就发结果发送到调查ID=1,并把调查结果返回到客户端。首先创建SOAP Client的实例:

  Private Sub cmdSubmit_Click()

  Dim soapClient As Object

  Dim strSurveyResults As String

  Set soapClient = CreateObject("MSSOAP.SoapClient30")

  Call SoapClient.mssoapinit("http://localhost/soaplisten/testsurvey.wsdl","TestSurvey")

  '发送调查,并返回结果

  Call soapClient.RespondToSurvey(1, optAgree.Value)

  strSurveyResults = soapClient.DisplaySurveyResults(1)

  Call MsgBox(strSurveyResults, vbInformation + vbOKOnly, "Survey Responses")

  End Sub

  在调查表单里,添加名为lblSurveyQuestion的Label控件,用来显示调查的问题,两个radio button,名为optAgree(标题为“同意”)和optDisAgree(标题为“不同意”),一个Command Button,名为cmdSubmit。在窗体的Load事件里,我们把问题请求回来,然后用提交按钮发送给Web Services,然后返回结果。下面就是测试的结果:

  

  从上面的例子可以看出,访问Web Services是很简单的,在VB中调用Web Services的方法就象我们直接调用MSSOAP.SoapClient30的方法一样,是不是很方便。

原文转自:http://www.ltesting.net