加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 03:00:06 所属栏目:安全 来源:网络整理
导读:透视和调整你的企业和商务系统( Ⅲ: SOAP 、 WebService 、 Server ) ? 小气的神 2001-10-12 ? ??? 好了,终于可以开始使用 Microsoft SOAP Toolkit 将上面的建立的 Bus_Authors 转换成一个 WebService 了,我使用的是 Microsoft SOAP Toolkit 2.0 SP2,

透视和调整你的企业和商务系统(Ⅲ:SOAPWebServiceServer

?


小气的神 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 MapperCTM)来处理ADODB.Recordset的格式。先讲一下下面需要做的步骤吧:

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

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

3.?? 设置IIS,配置好AuthorsWebService

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 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.?? 获得这个组件的PROGIDCLSID,你可以使用OLE/COM Object Viewer工具

PROGID: AdoTypeMapper.AdoRstTypeMapper

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

3.?? C:/Inetpub/wwwroot/Authors目录(上一篇中特别提及的那个目录)CopyWSDL Generator产生的WSDLWSML文件到这个目录。

4.?? 修改Authros.WSDLAuthors.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测试的,另外一个去另外一部机器使用一个dotNETWinForm测试的。

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

?

?

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

?


特别:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读