使用 SOAP Toolkit 2.0 将现有代码作为 Web 服务提供
使用 .NET 建立分布式应用程序
Steve Kirk 和 Priya Dhawan
Microsoft Developer Network
摘要:本文介绍了使用 Microsoft SOAP Toolkit 版本 2.0 将现有 Microsoft Visual Basic 6.0 代码作为 Web 服务提供时所进行的数据转换。
目录
简介
现有代码提供的数据类型
ADO 2x Command 对象
ADO 2x Recordset 对象
Stream 对象
XMLDOM 对象
总结
简介
Microsoft®SOAP Toolkit 版本 2.0 简化了将现有代码作为 Web 服务提供和使用的任务,MSDN Library 的 SDK 部分中的 SOAP Toolkit 2.0 文档(英文)对此进行了说明。在服务器端执行的一些主要功能是,在现有代码传递的不同数据类型的数据和 XML 消息(在 Web 服务客户机和服务器之间使用)之间进行转换。简单数据类型的转换可以自动处理,较为复杂的数据类型则需要开发人员提供转换代码。
评估现有代码是否适合于作为 Web 服务提供时,本文讨论的数据转换问题并不是唯一需要考虑的问题。应考虑的其它因素包括对象和状态模型、返回的数据大小、如何表示已经成功、如何返回错误信息、安全模型(包括访问控制、身份验证和加密)、执行模型(同步或异步)、如何分发代码,以及事务模型(COM+ 事务或声明型事务),等等。这些问题将在即将发表的体系结构主题(英文)文章中进行讨论。
现有代码提供的数据类型
要介绍现有代码传递的所有数据类型的转换是一个相当大的工程,因此本文介绍了某些最常用的数据类型。通过 SOAP Toolkit 代码进行转换的一个替代方案是使用 XML 接口对现有代码进行扩展。本文讨论了以下数据类型的转换方法:
ADO 2x Command 对象
ADO2x Recordset 对象
Stream 对象
XMLDOM 对象
ADO 2x Command 对象
直接访问数据库的现有代码经常会提供 Microsoft ActiveX® 数据对象 (ADO) 的 Command 对象。虽然不能在运行于不同进程中的应用程序层之间传递 Command 对象,但可以在同一进程内传递该对象。对于单行数据实体,通过 Command 对象的输出参数返回数据比通过 ADO 记录集返回数据效率更高。因此,ADO Command 对象对于返回单行实体数据十分有用。
读数据
以下示例中的现有代码返回一个 ADO Command 对象,它包含作为输出参数的数据。在传递给 Web 服务的客户之前,Custom Type Mapper 中的代码使用 SoapSerializer 对象对 Command 对象进行转换:
With SoapSerializer
`转换 CommandType
.startElement "CommandType"
.writeString Cmd.CommandType
.endElement
`转换 CommandText
.startElement "CommandText"
cmdText = Cmd.CommandText
cmdText = Left(Cmd.CommandText, Len(cmdText) - 8)
cmdText = Right(cmdText, Len(cmdText) - 7)
.writeString cmdText
.endElement
`转换 Parameters 集合
.startElement "Parameters"
For i = 0 To oCmd.Parameters.Count - 1
.startElement Right(oCmd.Parameters(i).Name, _
Len(oCmd.Parameters(i).Name) - 1)
.startElement "Direction"
.writeString oCmd.Parameters(i).Direction
.endElement
.startElement "Type"
.writeString oCmd.Parameters(i).Type
.endElement
.startElement "Size"
.writeString oCmd.Parameters(i).Size
.endElement
.startElement "Value"
.writeString oCmd.Parameters(i).Value
.endElement
.endElement
Next
.endElement
End With
写数据
将数据作为 Command 对象的参数传递是一种非常有效的数据传递方法。它还可以进行扩展,并提供了一些类型检查功能。
以下示例中,客户提交给 Web 服务的 XML 数据被转换为 ADO Command 对象的参数,它将被传递到现有代码:
Dim Cmd As ADODB.Command
Dim Param As ADODB.Parameter
' pNode 是包含客户提交的 XML 的 MSXML2.IXMLDOMNode
' 实例化一个 ADO Command 对象
Set Cmd = New ADODB.Command
With Cmd
' 应用 CommandType 和 CommandText
.CommandType = _
CInt(pNode.selectSingleNode("CommandType").nodeTypedValue)
.CommandText = pNode.selectSingleNode("CommandText").nodeTypedValue
' 填充 Parameters 集合
Set nodeParent = pNode.selectSingleNode("Parameters")
For i = 0 To nodeParent.childNodes.length - 1
Set nodeParameter = nodeParent.childNodes(i)
Set Param = New ADODB.Parameter
With Param
.Name = "@" + nodeParameter.nodeName
.Direction = _
nodeParameter.selectSingleNode("Direction").nodeTypedValue
.Type = nodeParameter.selectSingleNode("Type").nodeTypedValue
.Size = nodeParameter.selectSingleNode("Size").nodeTypedValue
.Value = factory.getMapper(enXSDstring, _
Nothing).Read(nodeParameter.selectSingleNode("Value"), _