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