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

发表于:2007-06-30来源:作者:点击数: 标签:
透视和调整你的企业和商务系统(Ⅲ: SOA P、WebService、Client) 小气的神 2001-10-13 客户端的 测试 ,主要是使用两个 VB 程序来测试一下,实际应用中可以是多种形式的VC、ASP或Script等方式的,只要和支持COM接口的都可以,但是真正发行你的客户端的时候
透视和调整你的企业和商务系统(Ⅲ:SOAP、WebService、Client)
  


小气的神 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
运行结果如下图:




接着开始到另外一部机器Dereksvr上去生成一个dotNET的WinForm来测试一下。原理上是一致的,不同的是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中建立一个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("OtherMethod",
                              BindingFlags.InvokeMethod,
                              null,
                              SoapClient,
                              pars);
最后的运行结果如下:





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

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