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

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

透视和调整你的企业和商务系统(Ⅲ: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是不同的。”
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 安装 记录

精华推荐

更多

精品下载

更多