在.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的接口,基本上就是这样了,具体的可以参考我写的一个完整的例子。
相关网址