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

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

发布时间:2020-12-17 03:00:07 所属栏目:安全 来源:网络整理
导读:透视和调整你的企业和商务系统( Ⅲ: SOAP 、 WebService 、C lient ) ? 小气的神 2001-10-13 ? ? ??? 客户端的测试,主要是使用两个 VB 程序来测试一下,实际应用中可以是多种形式的 VC 、 ASP 或 Script 等方式的,只要和支持 COM 接口的都可以,但是真

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

?


小气的神 2001-10-13

?

?

??? 客户端的测试,主要是使用两个VB程序来测试一下,实际应用中可以是多种形式的VCASPScript等方式的,只要和支持COM接口的都可以,但是真正发行你的客户端的时候,你需要附加MS SOAP Toolkit的分发库和CTM组件。也许正是这个原因,在做完这个测试之后,我又考虑用ASP.NET 方式的WebService实现,这样客户端才能够更加轻巧。

??? 如果你熟悉VBCOMVB版的测试很简单。最麻烦的就是IIS的配置,以及WSDLWSML的语法是否正确,往往这是最费时间的。建议你多产生几次WSDLWSML文件,从最简单的开始,先不要调试ADODB.Recordset的,等基本和简单的调试成功,然后再调试ADODB.Recordset类型的。WebService的一个好处就是比以前更安全一些。

先是VB版本,而且在本机进行测试:

Private Sub cmdVersion_Click()

??? Dim retStr As String

???????

??? Dim SoapClient As MSSOAPLib.SoapClient

??? Set SoapClient = New MSSOAPLib.SoapClient

???????

??? Call SoapClient.mssoapinit(strWSDLUrl,"",strWSMLUrl)

??? retStr = SoapClient.Version()

???

??? MsgBox retStr

??? Set SoapClient = Nothing

End Sub

?

Private Sub cmdSOAP_Click()

On Error GoTo ErrHandle

?

??? Dim result As ADODB.Recordset

??? Dim strHeaders As String

???

??? Dim SoapClient As MSSOAPLib.SoapClient

??? Set SoapClient = New MSSOAPLib.SoapClient

???

strHeaders = "Au_ID/姓名/Name/Phone/地址/City/State/Zip/Contract"

???

??? Call SoapClient.mssoapinit(wsdlUrl,wsmlUrl)

?

??? Set result = SoapClient.GetAuthors()

???

??? LvwHeadName lstAuthors,strHeaders

??? ADOFillLvw result,lstAuthors

???

MsgBox "共得到 " & result.RecordCount & " 条记录 "

???

ErrExit:

??? Set SoapClient = Nothing

??? Exit Sub

ErrHandle:

??? MsgBox SoapClient.detail

??? Resume ErrExit

End Sub

运行结果如下图:

?

?

接着开始到另外一部机器Dereksvr上去生成一个dotNETWinForm来测试一下。原理上是一致的,不同的是dotNET方式下似乎更麻烦一些(haha),不过整个dotNET的互操作性可以说是一流的,唯一让人感到担忧的是程序执行的性能问题。首先还有一些工作要做:

1.?? Dereksvr上安装 Microsoft SOAP Toolkit 2.0 SP的分发库(因为要应用MSSOAPLib库)

2.?? 安装和注册CTM,Regsvr32 AdoRstTypeMapper.dll

3.?? 检查WSDL文件的最后一句如果是localhost请把它改成你的机器名或IP

如果原来是:

?<service name='Authors' >

??? <port name='AuthorsSoapPort' binding='wsdlns:AuthorsSoapBinding' >

????? <soap:address location='http://localhost/Authors/Authors.WSDL' />

??? </port>

? </service>

修改成:

? <service name='Authors' >

??? <port name='AuthorsSoapPort' binding='wsdlns:AuthorsSoapBinding' >

????? <soap:address location='http:// henrysvr/Authors/Authors.WSDL' />

??? </port>

? </service>

这主要是如果其他机器调用这个WebService,那么设置成localhost会在调用机的本地找这个Service,那么一定会出错的。

?

VS.NET中建立一个WinFormProject,然后选取,这样VS.NET会自动生成一个包装的代理类,Version的可以象下面这样调用:

using System.Reflection ;

??????? private void btnVersion_Click(object sender,System.EventArgs e)

??????? {

?

??????????? ??? //String retStr ;

???????

??????????? String strWSDLUrl ;

??????????? String strWSMLUrl ;

???????????????

??????????? MSSOAPLib.SoapClient SoapClient ;

???

??????????? SoapClient = new MSSOAPLib.SoapClient() ;

???????

??????????? strWSDLUrl = wsdlUrl;

??????????? strWSMLUrl = wsmlUrl;

???????????

??????????????? if ( txtWSDL.Text != "" &&? txtWSML.Text != ""? )

??????????????? {

??????????????????????? strWSDLUrl = txtWSDL.Text;

??????????????????????? strWSMLUrl = txtWSML.Text;

??????????????? }

???

??????????? SoapClient.mssoapinit(strWSDLUrl,strWSMLUrl) ;

?

??????????? Type type = SoapClient.GetType() ;

??????????? Object retObject = type.InvokeMember( "Version",BindingFlags.InvokeMethod,null,SoapClient,null ) ;

?

??????????? MessageBox.Show ( retObject.ToString() )? ;

}

前面需要添加using System.Reflection ;

对于GetAuthors稍微麻烦一些,因为获得的ADODB.Recordset需要转换一下,我将它又显示在一个Grid控件中。具体的代码如下:

private void btnGetAuthors_Click(object sender,System.EventArgs e)

{

??? // GetAuthors

??? String strWSDLUrl ;

??? String strWSMLUrl ;

???????

??? MSSOAPLib.SoapClient SoapClient ;

???

??? SoapClient = new MSSOAPLib.SoapClient() ;

???

??? strWSDLUrl = wsdlUrl;

??? strWSMLUrl = wsmlUrl;

???

??? if ( txtWSDL.Text != "" &&? txtWSML.Text != ""? )

??? {

??????? strWSDLUrl = txtWSDL.Text;

??????? strWSMLUrl = txtWSML.Text;

??? }

??? ADODB.Recordset rst =? new ADODB.Recordset() ;

???

??? SoapClient.mssoapinit(strWSDLUrl,strWSMLUrl) ;

???

??? Type type = SoapClient.GetType() ;

??? Object retObject = type.InvokeMember( "GetAuthors",null ) ;

???

??? OleDbDataAdapter myAdapter ;

??? myAdapter = new OleDbDataAdapter() ;

??? DataSet tmpDataSet = new DataSet() ;

??? myAdapter.Fill( tmpDataSet,retObject,"Authors" ) ;

???

??? dataGrd1.DataSource = tmpDataSet ;

}

?

这个需要加入ADODB 2.7的引用库还有下面的语句:

using System.Data.OleDb;

?

如果是多个参数的可以使用这样的方式

Object[] pars = new Object[2];

pars[0] = 3 ;

pars[1] = "MyPars";

object ret= type.InvokeMember("OtherMethod",

????????????????????????????? BindingFlags.InvokeMethod,

????????????????????????????? null,

????????????????????????????? SoapClient,

????????????????????????????? pars);

最后的运行结果如下:

?

?

?

整个dotNET的过程,和上面VB的几乎一样,尽管结果出来了,我仍是很不满意,因为都是采用引用SOAP库引用的方式进行的,只能说明dotNET的互操作性比较好,客户端依然很沉重。无法想像这样的dotNET客户端程序可以获得真实的应用,安装和性能都还是未知数。不过有一点可以肯定,那就是dotNET的互操作性很强,从技术和内核上,dotNET和以前MS的产品和技术相比可以说都是另辟新路,许多设计上宁可舍弃和以前的保持兼容,但关于组件服务的立场上实际是增强了,有人说有了dotNETCOM已经死了。我想也许dotNET是用另一种眼光和另一种方式在看以前的COM.dotNET会说,“我很喜欢COM,但我和COM是不同的。”


特别:

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

(编辑:李大同)

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

    推荐文章
      热点阅读