我们最近通过编写新的 WCF 服务来做到这一点,这些服务以 VB6 可以处理的简单方式公开服务。就像您说的那样,VB6 无法处理复杂类型,因为它们不是由 .net 之类的代理生成的。所以我们的解决方案是将现有服务包装(外观?)VB6 可以调用的东西。
我们的服务返回一个字符串,其中包含一个 XML 文档,该文档可以在 VB6 中解析为所需的对象,即返回一个包含 10 个客户端的 XML 文档,然后将其解析为客户端对象的集合。
创建 WCF 服务后,您需要获取 WSDL 并将其保存在本地或将代码指向 WSDL 位置,我们在尝试通过 HTTPS 获取 WSDL 时遇到了一些麻烦,这就是我们将其保存在本地的原因。
为了使用它们,我们使用了 MS 的 SOAP 工具包。
这是一些用于创建请求和解析结果的示例代码:-
Set m_ServiceClient = New MSSOAPLib30.SoapClient30
With m_ServiceClient
.MSSoapInit "c:\service.wsdl"
.ConnectorProperty("Timeout") = "30000"
End With
lLoading = ParseResultToLoading(m_ServiceClient.GetLoadingByCountryIdProductId(llProductId, _
Countries(), _
Duration, _
lsTravellerType, _
Traveller.MedicalScore, _
Traveller.InitialAmount, _
Traveller.AdditionalWeekAmount, _
IssueDate))
Private Function ParseResultToLoading(XMLString As String) As Loading
Dim x As Loading
Dim objXML As New MSXML2.DOMDocument
Dim objElem As MSXML2.IXMLDOMElement
If Not objXML.LoadXML(XMLString) Then
Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason
End If
Set objElem = objXML.selectSingleNode("//LoadingInfo")
Dim objSub As MSXML2.IXMLDOMElement
' iterate its sub-nodes
For Each objSub In objElem.childNodes
Select Case UCase$(objSub.tagName)
Case "FIXED"
x.Fixed = objSub.Text
Case "FIXEDNET"
x.FixedNet = objSub.Text
'any other values that are required...
End Select
Next
ParseResultToLoading = x
End Function
您可以在代码示例中看到,我们将数组、字符串、长整数和日期传递给服务调用没有任何问题。不能使用任何 .net 返回类型(除了明显的返回类型!),因为 VB6 无法理解它们是什么。您可以使用类似的设计将信息推送回服务。
关于在您的库中抛出的异常,我们只是使用标准 .net 代码来抛出我们需要的任何异常或允许现有异常冒泡,您可以通过包含各种故障属性的 MSSOAPLib30.SoapClient30 对象获取异常信息。
最后一切运行良好,运行没有问题,最好的一点是 VB6 现在使用与其他 .net 客户端完全相同的功能。
希望这能让您了解我们是如何做到的,并且可以帮助您做出决定。让我知道是否有任何不妥之处,或者您想要澄清其中的任何内容。