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

发表于:2007-06-30来源:作者:点击数: 标签:
透视和调整你的企业和商务系统(Ⅲ: SOA P、WebService、Server) 小气的神 2001-10-12 好了,终于可以开始使用Microsoft SOAP Toolkit将上面的建立的Bus_Authors转换成一个WebService了,我使用的是Microsoft SOAP Toolkit 2.0 SP2,简单的Version()的我就跳
透视和调整你的企业和商务系统(Ⅲ: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文件中,产生这样的XML:
  <message name=@#Authors.GetAuthors@#>
  </message>
  <message name=@#Authors.GetAuthorsResponse@#>
    <part name=@#Result@# type=@#xsd:???????@#/>
  </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:\.netpub\wwwroot\Authors目录(上一篇中特别提及的那个目录)Copy由WSDL Generator产生的WSDL和WSML文件到这个目录。
4.   修改Authros.WSDL和Authors.WSML内容。
先改Authros.WSML :
<?xml version=@#1.0@# encoding=@#UTF-8@# ?>
<!-- Generated 10/12/01 by Microsoft SOAP Toolkit WSDL File Generator, Version 1.02.813.0 -->
<servicemapping name=@#AuthorsDoc@#>
  <service name=@#AuthorsDoc@#>
    <using PROGID=@#bus_Authors.Authors@# cachable=@#0@# ID=@#AuthorsObject@# />
<using PROGID=@#AdoTypeMapper.AdoRstTypeMapper@#
       cachable=@#0@#
       ID=@#AdoRstMap@# />
<types>
   <type name=@#ADOSoapMap@#
         targetNamespace=@#http://tempuri.org/type@#
         uses=@#AdoRstMap@#
         iid=@#{0C839C51-81E1-4DBC-AC69-3794E337B5F3}@#/>
</types>
    <port name=@#AuthorsSoapPort@#>
      <operation name=@#Version@#>
        <execute uses=@#AuthorsObject@# method=@#Version@# dispID=@#1610809347@#>
          <parameter callIndex=@#-1@# name=@#retval@# elementName=@#Result@# />
        </execute>
      </operation>
      <operation name=@#GetAuthors@#>
        <execute uses=@#AuthorsObject@# method=@#GetAuthors@# dispID=@#1610809349@#>
          <parameter callIndex=@#-1@# name=@#retval@# elementName=@#Result@# />
        </execute>
      </operation>
    </port>
  </service>
</servicemapping>
蓝色字体是你要新增的。ADOSoapMap将被在下面的Authors.WSDL中。

Authors.WSDL 需要修改和新增的:
  <types>
    <schema 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/@#
      elementFormDefault=@#qualified@#>
     <complexType name="ADOSoapMap">
        <sequence>
         <any/>
        </sequence>
      </complexType>
    </schema>
  </types>
    将于原来的:
  <message name=@#Authors.GetAuthorsResponse@#>
    <part name=@#Result@# type=@#xsd:???????@#/>
  </message>
    修改成下面这样:
  <message name=@#Authors.GetAuthorsResponse@#>
    <part name=@#Result@# type=@#typens:ADOSoapMap@#/>
  </message>
注意红色字体部分,我曾写成type=@#xsd:ADOSoapMap@#,结果测试时多花费了许多时间。

然后在IE中测试 看链接是否正常,如果显示正确那么我们开始进行下面的测试了。客户端的测试有两个,一个我在本机用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协议的,也就是说和它的通讯是可以穿透防火墙的。对我来说,已经没有可以再使用的机器了。具体的结构图可能是这样的。




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

原文转自:http://www.ltesting.net