Мы сделали это недавно, написав новые сервисы WCF, которые предоставляют сервис простым способом, который может обрабатывать VB6. Как вы говорите, VB6 не может обрабатывать сложные типы, так как они не генерируются прокси-сервером, как .net сделает для вас. Таким образом, наше решение заключалось в том, чтобы обернуть (фасад?) Существующий сервис во что-то, что может вызвать VB6.
Наш сервис вернул строку, которая содержала XML-документ, который можно было проанализировать в VB6 в требуемый объект, то есть вернуть XML-документ, содержащий 10 клиентов, а затем проанализировать его в коллекции клиентских объектов.
Как только служба WCF была создана, вам нужно захватить WSDL и сохранить его локально или указать код в местоположении WSDL, у нас возникли некоторые проблемы при попытке получить WSDL через HTTPS, поэтому мы сохранили его локально.
Для их использования мы использовали SOAP инструментарий от MS.
Вот пример кода для создания запроса и анализа результата: -
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
Вы можете увидеть в примере кода, что мы без проблем передали массивы, строки, long и даты в вызов службы. Не могу использовать никакие типы возврата .net (кроме очевидных!), Так как VB6 не поймет, что это такое. Вы можете использовать аналогичный дизайн для передачи информации обратно в сервис.
Что касается исключений для выброса в вашу библиотеку, мы просто использовали стандартный код .net для выброса любых исключений, которые нам нужны, или позволяли существующим исключениям всплывать, и вы можете получить информацию об исключениях через объект MSSOAPLib30.SoapClient30, в котором содержатся различные свойства ошибок.
В конце концов, все работало очень хорошо, проблем с запуском не было, и лучше всего то, что VB6 теперь использует те же функции, что и другие клиенты .net.
Надеюсь, это даст вам представление о том, как мы это сделали, и что это может помочь вам в ваших решениях. дайте мне знать, если что-то не имеет смысла, или вы хотите получить разъяснения по любому из них.