VB6调用返回实体类的WebService接口

xiaoxiao2026-06-07  4

     在.NET里调用WebService接口是非常简单的事情,但如果客户使用VC、VB开发,那怎么调用.NET开发的WebService的接口呢?以VB6为例。其实在VB6里调用.NET开发的WebService的接口,还是很简单的。先安装SOAP Toolkit 3.0(下载地址看文后),然后引用Microsoft Soap Type Library V3.0.可以定义SoapClient30对象来调用WebService的接口。

Private Sub Command1_Click()        ' 定义SoapClient30对象    Dim MySoap As SoapClient30    Set MySoap = New SoapClient30     ' WebService的URL,如果只是返回一些简单的类型,例如string,int,Boolean    ' 后面的参数可以为空,也可以使用MSSoapInit方法调用    MySoap.MSSoapInit2 "http://localhost/MyService/MyService.asmx?WSDL", "", "", "", ""        ' 调用经典的、永垂不朽的HelloWorld    MsgBox MySoap.HelloWorld()     End Sub

     如果WebService的返回值只是一些常用类型,可以像上面一样调用,但这样肯定不能满足我们的需求,如果返回值是自定义类,那VB6怎么得到返回值呢?上面的方法是不行的。

    在.NET里引用WebService时,已经自动生成了调用WebService的代理类、实体类,所以调用WebService就像调用.NET本身的类库一样简单,但在VB6或者VC里调用返回自定义类的接口,要手动的注册代理类、实体类,才能得到返回值。

    VB6注册WebService代理类和实体类要实现MSSOAPLib30的IGCTMObjectFactory接口,新建一个类模块:

    Implements IGCTMObjectFactory

Private Function IGCTMObjectFactory_CreateObject(ByVal par_WSMLNode As IXMLDOMNode) As Object        Dim node As IXMLDOMNode

       On Error GoTo IGCTMObjectFactoryTrap            Set node = par_WSMLNode.Attributes.getNamedItem("targetClassName")

      Set IGCTMObjectFactory_CreateObject = Nothing

     If Not (node Is Nothing) Then          Select Case node.nodevalue     ' 判断要映射成哪个实体类            Case "User"                  Set IGCTMObjectFactory_CreateObject = New User        End Select    End If

Exit Function

IGCTMObjectFactoryTrap:    Err.Raise Err.Number, "clsof_Factory_MyService", Err.Description    End Function

如果有多个实体类,需要在Select Case node.nodevalue里判断,并映射成相应的类。

下面的代码就是使用IGCTMObjectFactory接口来映射自定义类。Private Sub Form_Load()    Set MySoap = New SoapClient30        Dim strWSML As String    strWSML = "<servicemapping>"    strWSML = strWSML & "<service name='MyService'>"    strWSML = strWSML & "<using PROGID='MSSOAP.GenericCustomTypeMapper30' cachable='0' ID='GCTM'/>"    strWSML = strWSML & "<types>"    strWSML = strWSML & "<type name='User' targetNamespace='http://tempuri.org/' uses='GCTM' targetClassName='User'/>"    strWSML = strWSML & "</types>"    strWSML = strWSML & "</service>"    strWSML = strWSML & "</servicemapping>"        MySoap.MSSoapInit2 "http://localhost/MyService/MyService.asmx?WSDL", strWSML , "MyService", "MyServiceSoap", "http://tempuri.org/"    Set MySoap.ClientProperty("GCTMObjectFactory") = New clsof_Factory_MyService    End Sub

参数说明如下:WSDLFile 字符型。该参数是WSDL文件的URL,用于描述由服务器提供的服务,或者是包含在WSDL文件中的一个字符串。如果该参数的第一个字符是<,表示该参数值是一个WSDL字符串;否则,表示该参数值是一个WSDL文件。 WSMLFile 字符型。可选的。该参数是WSML文件的URL,在使用自定义类型映射程序时,该参数是必须的。

ServiceName 字符型。可选的。该参数是在WDSL文件中的服务。如果忽略该参数、或为NULL、或为空字符串(""),在初始化SoapClient30对象时,则使用在WSDL文件中指定的第一个服务。 Port 字符型。可选的。该参数是在WSDL文件的端口名称,用来包含在SOAP请求信息中的指定操作。如果忽略该参数、或为NULL、或为空字符串(""),在初始化SoapClient30对象时,则使用在WSDL文件中指定的第一个端口。

返回自定义类可以让客户端很方便的使用返回值,但比较通用的做法是直接返回XML,实际上,WebService的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准。

在VB6里调用返回自定义类的WebService的接口,基本上就是这样了,具体的可以参考我写的一个完整的例子。

相关网址

VB6调用返回实体类的WebService接口源代码

VB6中如何使用C#开发的WebService进行开发

SOAP Toolkit 3.0

Microsoft Office XP Web Services Toolkit 2.0

转载请注明原文地址: https://www.6miu.com/read-5049760.html

最新回复(0)