我需要开发一个.net库,它将java web服务代理暴露给传统的vb6 asp web应用程序。作为第一次执行此类任务而不了解vb6编程语言,我需要一些经验丰富的程序员进行一些清理。 首先,我搜索了网页,我发现了以下链接(如果有人认为它有用):http://migrationguide.artinsoft.com/Migration-Guide-Faq-Chapter-14.aspx
但仍有一些事情我不清楚:
Web服务代理的方法采用复杂类型(对象)参数并返回复杂类型(例如“记录”列表)。我应该如何映射thoose类型以使它们可以被vb6使用:结构或类(其中一些嵌套到其他结构中)?或简单类型的数组,最终嵌套类型的矩阵?
我认为这是obviuos我不能使用泛型,但我可以使用集合或我应该只使用数组?
我应该从我的图书馆内抛出什么样的例外? COMException?我有什么异常吗?以及vb6 Web应用程序如何使用它们:我的意思是我想提供比“和异常已经提出”更好的反馈。我发现了一些帖子,但它们很老,与旧版本的.net有关(实际上我使用的是3.5)
提前感谢您的任何帮助
答案 0 :(得分:1)
最后,我发现raccomanded pratice是将库作为Com对象公开。 如果像我这样的其他初学者可能会觉得它很有用,官方msdn指南是:
msdn.microsoft.com/en-us/library/zsfww439(V = VS.71)的.aspx
由于数组给我带来了一些麻烦,以下提示可能会有所帮助:
下面我已经添加msdn指南到编组数组和另一个我发现有用的帖子:
msdn.microsoft.com/en-us/library/z6cfh6e6.aspx
huntjason.spaces.live.com/blog/cns!9D2E96F2AA6AE85F!378.entry
感谢大家提供的意见和示例
答案 1 :(得分:0)
我们最近通过编写新的WCF服务来实现这一点,这些服务以VB6可以处理的简单方式公开服务。就像你说VB6无法处理复杂类型,因为它们不是像.net那样为你做的代理生成的。所以我们的解决方案是将现有服务包装(外观?)在VB6可以调用的内容中。
我们的服务返回一个字符串,其中包含一个XML文档,该文档可以在VB6中解析为所需的对象,即返回包含10个客户端的XML文档,然后将其解析为一组Client对象。
创建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客户端完全相同的功能。
希望能让您了解我们是如何做到的,并且可以帮助您做出决定。如果有任何事情没有意义,或者你想澄清其中任何一个,请告诉我。