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

发布时间: 2007-05-21 09:43    作者: 未知    来源: 未知    浏览:    评论

透视和调整你的企业和商务系统(Ⅲ: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:\Inetpub\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中测试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协议的,也就是说和它的通讯是可以穿透防火墙的。对我来说,已经没有可以再使用的机器了。具体的结构图可能是这样的。




Client端的代码看来也不少,我再专门写一篇吧。
 
Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多