透视和调整你的企业和商务系统(Ⅲ:SOAP、WebService、Server)

透视和调整你的企业和商务系统( Ⅲ: SOAP 、 WebService 、 Server )


小气的神 2001-10-12

好了,终于可以开始使用 Microsoft SOAP Toolkit 将上面的建立的 Bus_Authors 转换成一个 WebService 了,我使用的是 Microsoft SOAP Toolkit 2.0 SP2, 简单的 Version() 的我就跳过了,不再废话, MS 的随机帮助有这方面的说明。因为我更感兴趣 ADODB.Recordset 的问题,不过失望的是,使用 WSDL Generator 产生的 WSDL 不能支持 ADODB.Recordset 的类型

WSDL类型转换

产生的 WSDL 文件中,产生这样的 XML :

1<message name="Authors.GetAuthors">
2</message>
1<message name="Authors.GetAuthorsResponse">
2<part name="Result" type="xsd:???????"></part>
3</message>

根据随机文档特别是 Handling Complex Types 一节中的描述,我们需要使用一个 Custom Type Mapper ( CTM )来处理 ADODB.Recordset 的格式。先讲一下下面需要做的步骤吧:

1. 生成一个自定义的类型转换类处理 ADODB.Reocrdset 类型

2. 修改由 WSDL Generator 产生的 WSDL 文件。

3. 设置 IIS ,配置好 Authors 的 WebService

4. 产生客户端测试这个 WebService

先来生成 ADODB.Recordset 的 CTM, 主要是实现 SOAP Toolkit 库中的 MSSOAPLib.ISoapTypeMapper 接口,这一点上我认为是 MS SOAP Toolkit 2.0 的一个重大提高,比起上一个 SOAP Toolkit 版本更组件化和易于使用,现在你用 VB 就可以完成这个 CTM 了,建立一个 VB ActiveX DLL 项目,拷入下面的代码,(我产生的组件叫 AdoTypeMapper.AdoRstTypeMapper )如果另外安装了 MS SOAP Toolkit 2.0 里面好像有一个这样的 ADODB.Recorset 的例子。

Option Explicit

Implements MSSOAPLib.ISoapTypeMapper

Private Function ISoapTypeMapper_read( _

ByVal pNode As MSXML2.IXMLDOMNode, _

ByVal bstrEncoding As String, _

ByVal encodingMode As MSSOAPLib.enEncodingStyle, _

ByVal lFlags As Long) As Variant

Dim RecordSet As New ADODB.RecordSet

Dim domdoc As MSXML2.DOMDocument

Set domdoc = CreateObject("Msxml2.DOMDocument")

domdoc.loadXML (pNode.xml)

RecordSet.Open domdoc

Set ISoapTypeMapper_read = RecordSet

Set domdoc = Nothing

End Function

Private Function ISoapTypeMapper_varType() As Long

ISoapTypeMapper_varType = vbObject

End Function

Private Sub ISoapTypeMapper_write( _

ByVal pSoapSerializer As MSSOAPLib.ISoapSerializer, _

ByVal bstrEncoding As String, _

ByVal encodingMode As MSSOAPLib.enEncodingStyle, _

ByVal lFlags As Long, _

pvar As Variant)

Dim xDOM As New MSXML2.DOMDocument

Dim RecordSet As ADODB.RecordSet

Set RecordSet = pvar

RecordSet.Save xDOM, adPersistXML

pSoapSerializer.writeXML (xDOM.xml)

End Sub

你需要引用 Microsoft SOAP Type Library(SOAP Toolkit 安装目录的 \Binaries\MSSOAP1.dll) 和 Microsoft XML V3.0 的引用,然后编译成 DLL( 比如: AdoRstTypeMapper.dll) 。

然后开始配置 Server 端的 WebService 。

1. 注册这个 DLL . Regsvr32 AdoRstTypeMapper.dll

2. 获得这个组件的 PROGID 和 CLSID, 你可以使用 OLE/COM Object Viewer 工具

PROGID: AdoTypeMapper.AdoRstTypeMapper

CLSID: {0C839C51-81E1-4DBC-AC69-3794E337B5F3}

3. 在 C:\Inetpub\wwwroot\Authors 目录(上一篇中特别提及的那个目录) Copy 由 WSDL Generator 产生的 WSDL 和 WSML 文件到这个目录。

4. 修改 Authros.WSDL 和 Authors.WSML 内容。

先改 Authros.WSML :

 1<servicemapping name="AuthorsDoc">
 2<service name="AuthorsDoc">
 3<using cachable="0" id="AuthorsObject" progid="bus_Authors.Authors"></using>
 4<using cachable="0" id="AdoRstMap" progid="AdoTypeMapper.AdoRstTypeMapper"></using>
 5<types>
 6<type iid="{0C839C51-81E1-4DBC-AC69-3794E337B5F3}" name="ADOSoapMap" targetnamespace="http://tempuri.org/type" uses="AdoRstMap"></type>
 7</types>
 8<port name="AuthorsSoapPort">
 9<operation name="Version">
10<execute dispid="1610809347" method="Version" uses="AuthorsObject">
11<parameter callindex="-1" elementname="Result" name="retval"></parameter>
12</execute>
13</operation>
14<operation name="GetAuthors">
15<execute dispid="1610809349" method="GetAuthors" uses="AuthorsObject">
16<parameter callindex="-1" elementname="Result" name="retval"></parameter>
17</execute>
18</operation>
19</port>
20</service>
21</servicemapping>

蓝色字体是你要新增的。 ADOSoapMap 将被在下面的 Authors.WSDL 中。

Authors.WSDL 需要修改和新增的 :

1<types>
2<schema elementformdefault="qualified" targetnamespace="http://tempuri.org/type" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
3<complextype name="ADOSoapMap">
4<sequence>
5<any></any>
6</sequence>
7</complextype>
8</schema>
9</types>

将于原来的:

1<message name="Authors.GetAuthorsResponse">
2<part name="Result" type="xsd:???????"></part>
3</message>

修改成下面这样:

1<message name="Authors.GetAuthorsResponse">
2<part name="Result" type="typens:ADOSoapMap"></part>
3</message>

注意红色字体部分,我曾写成 type='xsd:ADOSoapMap' ,结果测试时多花费了许多时间。

然后在 IE 中测试 http://localhost/Authors/Authors.WSDL 看链接是否正常,如果显示正确那么我们开始进行下面的测试了。客户端的测试有两个,一个我在本机用 VB EXE 测试的,另外一个去另外一部机器使用一个 dotNET 的 WinForm 测试的。

目前我们的系统结构还没有变化,唯一有些变化的是 Henrysvr 这部机器上安装了 IIS 和 MS SOAP Toolkit 2.0 和我们刚刚生成的有关 ADODB.Recordset 的 CTM 组件,这个组件不要安装在 COM+ 环境中。只用简单的注册就可以了。事实上,实际应用中可以再多一部机器专门放置 IIS 和 WebService, 另外这部机器上安装上前面准备的 Proxy 包和 CTM 组件即可。这样原来应用中 App Server 还是 App Server. 新增的机器只放 IIS 和 CTM 来处理 WebService 的部分。拥有两个 IIS 的好处是原来的系统不用做任何改变,而对另一个 IIS 来说,由于它是基于 SOAP 协议的,也就是说和它的通讯是可以穿透防火墙的。对我来说,已经没有可以再使用的机器了。具体的结构图可能是这样的。

SOAP 体系结构

Client 端的代码看来也不少,我再专门写一篇吧。


特别:

以上文字和图片涉及其他人的隐私和个人权利,如非被授权或经本人同意,任何网站或期刊请不要刊登、转载、改编、转贴或已其他形式进行传播。以上所有文字和图片只用于内部交流,不作任何新闻发表和商业用途。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus