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

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


小气的神 2001-10-13

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

如果你熟悉 VB 和 COM , VB 版的测试很简单。最麻烦的就是 IIS 的配置,以及 WSDL 和 WSML 的语法是否正确,往往这是最费时间的。建议你多产生几次 WSDL 和 WSML 文件,从最简单的开始,先不要调试 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

运行结果如下图:

VB Client

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

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

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

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

如果原来是:

1<service name="Authors">
2<port binding="wsdlns:AuthorsSoapBinding" name="AuthorsSoapPort">
3<soap:address location="http://  localhost  /Authors/Authors.WSDL"></soap:address>
4</port>
5</service>

修改成:

1<service name="Authors">
2<port binding="wsdlns:AuthorsSoapBinding" name="AuthorsSoapPort">
3<soap:address location="http://  henrysvr  /Authors/Authors.WSDL"></soap:address>
4</port>
5</service>

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

在 VS.NET 中建立一个 WinForm 的 Project ,然后选取 , 这样 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" , BindingFlags.InvokeMethod, null,SoapClient, 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(" Other Method",

BindingFlags.InvokeMethod,

null,

SoapClient,

pars);

最后的运行结果如下:

dotNET SOAP Client

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


特别:

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

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