透视和调整你的企业和商务系统( Ⅳ: WebService 、 dotNET )
小气的神 2001-10-15
到上一篇为止,我们已经完成了在第一篇( Analyzing 、 Requirement )所说的三个过程中的第二步了,这一篇开始我们可以用 dotNET 的 WebService 方式来重新考虑以前的 Authors WebService, 技术上我倾向于 MS 的建议,那就是在实现和设计 Web Services 时将 ASP.NET 的 WebService 作为首选。所以这一篇我们将主要考察 ASP.NET 的 WebService.
这要从第二篇的分析开始,原来当我用 SOAP Toolkit 生成了 WebService 后,我就在 Dereksvr 机器上用 VS.NET 的 Add Web Reference... 输入 http://henrysvr/Authors/Authors.wsdl , VS.NET 也是可以发现这个 WebService ,但是由于 ADODB.Recordset 的问题,它无法生成 Proxy 类,当时我以为 SOAP Toolkit 生成的 WSDL 并不完全兼容很快放弃了继续向下实验了。几天之后我又做了另外一种尝试 : 我用 SOAP Toolkit 重新生成了 WebService 的 WSDL 文件,这次我没有把返回 ADODB.Recordset 的函数放到里面,也就是全部都是在第二篇说的标志类型,然后我又在 VS.NET 中重复了上述的步骤,这一次 OK 了, VS.NET 成功的生成了 Proxy 类,我生成了一个小例子测试,结果是成功的。那么结论是:对于第二类返回特殊类型的(也就是第二篇中用 CTM 的类型)我们要另外处理,对于第一种类型的我们只要用 MS SOAP Toolkit 生成 WSDL 文件,然后在 IIS 中设置好,就可以成为一个 WebService, 在消费这种 WebService 上我们不用特殊处理。不仅 VS.NET 可以直接使用,其他支持 WebService 规范的也是可以使用的(只能说估计。 Java ? Delphi ?抱歉我没有试过)下面是我测试成功的例子的拷图,感觉还不错,连中文也不用什么特殊处理。
Private Sub Button2_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim obj As henrysvr.Authors
Dim retString As String
Dim SendStr As String
SendStr = echoTxt.Text
obj = New henrysvr.Authors()
retString = obj.Echo(SendStr)
MessageBox.Show(retString)
End Sub

好了,剩下的又是 ADODB.Recordset 的问题,如果处理这个 COM 对象呢?之前我们已经用了一种方法, dotNET 作为 Client ,这次我换一种方式,生成一个 ASP.NET 方式的 WebService, 然后引用 bus_Authors 组件,对那些返回记录集的函数在这个 WebService 中做一个封装。比如:
1<webmethod()> Public Function Version() As String
2
3Dim obj As bus_Authors.Authors
4
5obj = New bus_Authors.Authors()
6
7Version = obj.Version
8
9End Function
10
11<webmethod()> Public Function GetAuthors() As DataSet
12
13Dim obj As bus_Authors.Authors
14
15Dim rst As ADODB.Recordset
16
17Dim myDataAdapter As OleDb.OleDbDataAdapter
18
19Dim retDataset As DataSet
20
21obj = New bus_Authors.Authors()
22
23rst = New ADODB.Recordset()
24
25myDataAdapter = New OleDb.OleDbDataAdapter()
26
27retDataset = New DataSet()
28
29rst = obj.GetAuthors()
30
31myDataAdapter.Fill(retDataset, rst, "GetAuthors")
32
33GetAuthors = retDataset
34
35End Function
36
37看的出来,就是简单的调用 Biz 组件,然后将 ADODB.Recordset 转换成 DataSet 。
38
39有关引用 Bus_Authors ,你可以在目前的这部机器上安装我们在第一篇 Export 出来的 Server 或 Proxy 都可以,我为了方便,直接使用了 Server 包。剩下来的就十分简单了,需要生成一个测试程序,这个就简单了,参照 Carl Franklin 的录像就可以了。算是也自己练习一次 haha 。
40
41( 具体参见 http://www.csdn.net/develop/read_article.asp?id=10816 )
42
43下面是运行的代码和拷图:
44
45Private Sub Page_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
46
47'Put user code to initialize the page here
48
49Dim rs As DataSet
50
51Dim obj As New localhost.Authors()
52
53rs = obj.GetAuthors()
54
55DataGrid1.DataSource = rs
56
57DataGrid1.DataBind()
58
59End Sub
60
61
62
63至于 VB 版本的客户端也是可以的,你可以在另外一部机器上用下面的代码进行测试:
64
65Dim RetXML as Object
66
67Dim SoapClient As MSSOAPLib.SoapClient
68
69Set SoapClient = New MSSOAPLib.SoapClient
70
71Call SoapClient.mssoapinit("http://Dereksvr/Authors/Authors.asmx?WSDL")
72
73Set RetXML = SoapClient.GetAuthors()
74
75如果成功返回的应当是一个 IXMLDOMNodeList 里面包括整个的 Dataset 结构和 23 条数据,至于具体的显示这个结果集的 VB 程序就不再说了,以后也许会专门有文章论述如何将 dotNET 的 DataSet 转化成 VB 可以识别的问题,比如会有 FillListView( lstv As Control , obj as Object) 之类的函数将这个 XML 结构填充到 VB6 ListView 或 Grid 控件中 , 这里我就不详细说了。具体的你还可以在其他机器上使用 http://Dereksvr/Authors/Authors.asmx 然后选取 GetAuthors 然后点击调用获得结果,也可以直接点: http://Dereksvr/Authors/Authors.asmx/GetAuthors ? 你在 IE 窗口上可以明显的看到这个返回结果的 XML 文档(从中你可以看到 DataSet 最原始的构造 haha )。
76
77掌握不同返回类型分别处理的原则,无论是 MS SOAP Toolkit 还是 ASP.NET WebService 都是可以被我们所用。看起来使用 dotNET 会简单和省力许多。我想随着 dotNET 技术的推进,越来越多的人会考虑用 dotNET 技术实现一些新的商务或企业应用系统,至少我会这样。也许这些例子是想说明从现在的 Windows DNA 构架切换到新的 dotNET 体系结构下,是可行也是可以被你控制的。并不是像一些人以为的那样,认为只用 VS.NET 重新编译一遍原来的应用就 OK ,也不能像另外一些人以为的那样,认为 dotNET 根本是市场的策略,而且真正实施起来很麻烦很困难,还要等个 3 - 5 年。
78
79* * *
80
81特别: 以上文字和图片涉及其他人的隐私和个人权利,如非被授权或经本人同意,任何网站或期刊请不要刊登、转载、改编、转贴或已其他形式进行传播。以上所有文字和图片只用于内部交流,不作任何新闻发表和商业用途。</webmethod()></webmethod()>