`

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

阅读更多

     在.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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics