在.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
分享到:
相关推荐
网上写vb6.0调用webservice的都写得比较简单, 这个结合实例作了较详细介绍
.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子
webservice接口调用实例,经个人验证可用
vb6也能调用.net或Java开发的WebService,经调试可行!
Java调用.NET的WebService接口实例,jar包删减到三个,干净清爽,里面包含注多注释和图解,搞了半天的家伙拿出来与大家分享,无任何BUG,修改里面的参数即可直接运行,对于这种好东西,花了半天时间10分不算高,重在...
Java Axis 直接调用webservice 接口工具类, 无需根据wsdl编译客户端,需要axis相关包,测试使用axis 1.4, 附demo引入axis包后直接可以测试;
描述如何在VB6里面实现webservice调用
JAVA调用WEBSERVICE接口
最近项目中遇到需要去掉老系统的webservice服务中的insert方法,找了很久,发现这样最简单,实测有效!!!
C#开发核心代码,用拼接XML方式,调用封装了实体类的SOAP接口
oracle调用webservice接口地址demo
希望用http协议的能可以帮到大家!很有使用价值!大家可以看看!
java调用webservice接口案例,精简,service调用webservice接口案例;不用生成一堆代码,逻辑清晰
python调用WEBSERVICE接口
Java中如何通过https调用Webservice接口
调用https协议的webservice,以及证书手动加载。
调用短信验证码webservice接口调用工具类所依赖的jar包
使用WSDL生成webService接口,编写Test调用方法进行测试