级别: 初级 Henry Yu (j2ee_2000@yahoo.com), 乔治亚州哥伦布
2002 年 2 月 01 日 有了 DB2,您可以在自己喜欢的应用程序环境中应用 Web 服务。本文向您展示了创建使用 DB2 DADX Web 服务的 .NET 客户机是如何之容易。
简介
现在已经有许多关于使用 DB2® Universal Database 和 Web 服务方面的文章,但我所读过的所有文章都是讨论在 Java 环境下使用 Web 服务。我曾遇到过一个商业方案,其中 Web 服务编程模型的好处是不言而喻的,但我需要用 Microsoft® .NET 客户机来访问 DB2 数据。幸运的是,IBM 最近交付了一个 DB2 Web 服务对象运行时框架(Web Services Object Runtime Framework,WORF)的增强版,以支持与 .NET 的互操作性。
为什么使用 Web 服务以及为什么使用 DB2?
Web 服务是这样一个接口:它描述通过标准化的 XML
消息传递可网络访问的操作集合。Web 服务构建在一些现有的标准之上,如超文本传输协议(HyperText
Transfer Protocol,HTTP)、可扩展标记语言(eXtensible Markup Language,XML)、简单对象访问协议(Simple
Object Access Protocol,SOAP)、Web 服务描述语言(Web Services Description
Language,WSDL)和通用描述、发现和集成(Universal Description,Discovery and Integration,UDDI)。
Web 服务提供了一种与语言和环境都无关的编程模型,该模型加速了企业内部和外部的应用程序集成,还提供一个更好用的体系结构用于集成信息。
在 Web 服务对象运行时框架(WORF)中嵌入了 DB2 Web 服务支持。它支持以下类型的 Web 服务操作:
- 基于 XML 的查询或存储。将 XML 文档存储在 DB2 关系表中,在检索 XML 文档时,再进行组合。这种操作方法需要用到 DB2 XML Extender。需要创建称为文档访问定义(document access definition,DAD)文件的映射文档来描述 XML 文档与关系表之间的映射。
- 基于 SQL 的操作,譬如,调用存储过程或查询、插入、更新或删除 DB2
数据。用这种方法不需要 XML Extender,因为它使用基于表和列的缺省 XML 标记。
这两种 Web 服务操作都受控于称为文档访问定义扩展(Document Access Definition Extension,DADX)的文件。在 DADX
文件中定义了可以由 Web 服务执行的所有操作。可以在文本编辑器中手工地创建 DADX
文件,或者可以使用 WebSphere® Studio 工具来生成它。
由于 DB2 DADX Web 服务使客户机可以从因特网的任何地方访问 DB2
中的数据,因此对于许多商业方案(包括我在本文中所描述的),它提供了非常有价值的能力。
商业方案
金融服务和保险公司雇了许多销售人员来推销它们的产品和服务。销售人员可以是一位投资顾问、经纪人或代理。如
图
1 所示,销售人员通常使用前端系统(也许是 3270
屏幕)来连接到公司后端系统,以支持他们日常的销售活动。
图 1. 客户机/服务器销售支持模型
前端系统做两件事:
- 检索后端系统中的信息,包括类似于这样的信息 — 产品信息、客户信息和不同类型的表单。一些特定类型信息的示例如下:
- 某个特定共同基金的净资产额和投资组合信息
- 某些人寿保险的利率
- 客户填写的表单
- 向后端系统提交客户登记和开帐户信息,以做进一步处理。这种活动在大多数情况下需要向后端系统发送完整的表单。
使用 DB2 DADX Web 服务,我们可以为销售支持设计新的解决方案。我们没有构建紧耦合的联机支持系统,而是构建独立的、松耦合的智能客户机系统,该系统在连接或者断开的方式都可以工作。
如
图 2 所示,这个新的解决方案通过 DB2 DADX
Web 服务检索后端 DB2 数据库中与产品相关的信息和最新的表单。它还通过 DB2 DADX Web
服务提交完整的表单。DB2 是一个理想的数据库,它可以为这个电子商务应用程序提供数据管理,而 Web
服务就象完美的数据交换工具。
图 2. 基于 Web 服务的智能客户机解决方案
作为独立胖客户机(thick client),智能客户机系统不仅提供了更好的用户界面,而且还提供了功能强大的销售支持功能,譬如财务规划工具、分析工具甚至一些仿真工具。
这种解决方案的好处是什么?首先,可以不用连接后端系统来使用智能客户机系统。当客户机安装在便携机上,销售人员不再需要总是呆在实际存在的办公室 — 他们可以在路上使用这个系统。这个系统甚至可以安装在家中的台式机上。每当可以用因特网连接时,智能客户机系统可以通过
Web 服务与后端系统交换数据。其次,这个系统提供的功能强大的工具将有助于销售人员给他们的客户提供更好的服务。
出于某些原因(这不在本文讨论的范围之内),这里需要使用 C# 在 Microsoft
.NET 平台上构建该应用程序系统。用 C# 开发用于 DB2 DADX Web 服务的 .NET
客户机是可能实现的,因为 WORF 中构建了 .NET 互操作性支持。由于 WORF
支持 .NET 工具所使用的“文档样式”(“document style”)SOAP 绑定,这种互操作性变得非常容易实现。
下一节将展示如何用 C# 创建使用 DB2 DADX Web 服务的 .NET
客户机。由于这只是概念上的原型,因此使用了一个简化的商业方案。实际系统要更复杂。
创建解决方案
在这一节,我将向您演示如何实现 DB2 DADX Web
服务和使用这个服务的 .NET 智能客户机。这个客户机使用产品代码和州代码来从 DB2
中的利率表检索人寿保险的利率。
安装和配置软件
在这个演示中用到以下软件:
要设置开发环境,可以参考技术白皮书:Implementing DB2 Web Services
中的说明,下面链接包含了此白皮书的下载。
http://www7b.software.ibm.com/dmdd/zones/webservices/worf/。本文假定您按照该白皮书中的描述在 UNIX® 和 Windows 上安装和配置了用于 Apache Jakarta Tomcat 的 WORF。
如果您正在用 WORF 的先前版本,则必须用您以前所使用的指示信息来安装这个
新的
worf.jar 。
构建 DADX Web 服务
在 DB2 中创建新的数据库 DADXDEMO。在这个数据库中,将有两个新表:RATETABLE
和 AGE_TABLE,如
图 3所示。您可以在本文
下载部分找到创建数据库和样本数据的所有 DDL 和 SQL 语句。可以定义以下 SQL 查询,并用 WSAD SQL
查询构建器来测试它。这条 select 语句可用于根据产品标识和州代码来检索 RATETABLE 和 AGE_TABLE
中的定期人寿保险(Term Life Insurance)利率。
SELECT DB2ADMIN.AGE_TABLE.MIN_AGE,
DB2ADMIN.AGE_TABLE.MAX_AGE,
DB2ADMIN.RATETABLE.COVERAGE, DB2ADMIN.RATETABLE.RATE
FROM DB2ADMIN.AGE_TABLE, DB2ADMIN.RATETABLE
WHERE DB2ADMIN.AGE_TABLE.AGE_CDE = DB2ADMIN.RATETABLE.AGE_CDE
AND DB2ADMIN.RATETABLE.PRODUCT_ID = :prod
AND DB2ADMIN.RATETABLE.STATE = :state
ORDER BY MIN_AGE ASC, MAX_AGE ASC, COVERAGE ASC
|
图 3. 数据库表设计
可以用 WebSphere Studio Application Developer(WSAD)中的 XML
工具从 SQL 查询生成 DADX 文件。此外,可以创建用于部署到 WebSphere 和 Tomcat
上的组和组特性。出于测试目的,还可生成 Java 代理来访问 Web 服务。
由于本文所创建的 DB2 DADX Web
服务是通过 .NET C# 客户机来访问的,同时还由于我无权使用 WSAD V5,因此我在 WSAD 之外开发了 DB2 DADX Web 服务。但是如果您有
WSAD V5,您可以使用这些工具来代替。
从 WSAD 生成清单 1 中的 DADX 文件,并将其导出。在本文的下载部分包含该文件。
清单 1. DADX 文件 ProdInfoDadx.dadx
<?xml version="1.0" encoding="UTF-8"?>
<dadx:DADX xmlns:dadx="http://schemas.ibm.com/db2/dxx/dadx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xsi:schemaLocation="http://schemas.ibm.com/db2/dxx/dadx dadx.xsd
http://schemas.xmlsoap.org/wsdl/ wsdl.xsd">
<dadx:operation name="QueryProdInfo">
<wsdl:documentation xmlns="http://www.w3.org/1999/xhtml">
</wsdl:documentation>
<dadx:query>
<dadx:SQL_query>
SELECT DB2ADMIN.AGE_TABLE.MIN_AGE, DB2ADMIN.AGE_TABLE.MAX_AGE,
DB2ADMIN.RATETABLE.COVERAGE, DB2ADMIN.RATETABLE.RATE
FROM DB2ADMIN.AGE_TABLE, DB2ADMIN.RATETABLE
WHERE DB2ADMIN.AGE_TABLE.AGE_CDE = DB2ADMIN.RATETABLE.AGE_CDE
AND DB2ADMIN.RATETABLE.PRODUCT_ID = :prod
AND DB2ADMIN.RATETABLE.STATE = :state
ORDER BY MIN_AGE ASC, MAX_AGE ASC, COVERAGE ASC
</dadx:SQL_query>
<dadx:parameter name="prod" type="xsd:string"/>
<dadx:parameter name="state" type="xsd:string"/>
</dadx:query>
</dadx:operation>
</dadx:DADX>
|
部署和测试 Web 服务
对于简单的 DADX 文件,不值得为了部署它创建新的 Web
应用程序。在这里,我使用 WORF 示例 Web 应用程序。
以下是用 Tomcat 部署 DADX 文件的步骤:
- 通过克隆
dxx_sample.Group 组(WORF 样本中包含了该组)来创建新组
dxx_prodinfo 。可以在
services\WEB-INF\classes\groups
下找到该组。这个“services”是 WORF 白皮书中所描述的服务上下文。
- 将 DADX 放入
dxx_prodinfo 这个新组。
- 将
group.properties 从
dxx_sample 复制到
dxx_prodinfo 。
- 按如下修改
group.properties :
- 确保它指向正确的数据库。
- 添加特性
useDocumentStyle=true 。这个特性属于 .NET
所需的“document”绑定样式支持。我们将使用它来创建 .NET 客户机。
- 更新
web.xml 文件以向
dxx_prodinfo 组添加一些项。
要测试 Web 服务,启动 Tomcat,然后使用以下 URL
来测试 DB2 DADX Web 服务:
http://127.0.0.1:8080/services/db2prodinfo/ProdInfoDadx.dadx/TEST
|
图 4是测试屏幕。
图 4. 测试 QueryProdInfo 服务
创建 .NET 客户机
WSDL 文件是客户机使用 Web 服务的关键所在。它描述了特定的
Web 服务接口。WSAD 可以从 WSDL 文件生成 Web 服务代理。客户机程序使用代理来与 Web
服务交互。它是一个屏蔽了所有来自客户机程序的 SOAP 消息传递的代理。
缺省的 WSDL 绑定样式是“rpc”。然而,新版本的 WORF
还支持“document”绑定样式选项。IBM 工具支持这两个选项。但 Microsoft
工具只支持“document”样式选项。使用 WORF 中的“document”样式选项支持来与 .NET 互操作。
图 5 . 带“rpc”绑定样式的 WSDL 文件
对于给定的 DADX 文件,使用以下格式的 URL,WORF 生成用于 Web 服务的 WSDL 文件:
http://localhost:8080/webapplication/group/dadxfile/WSDL
|
图 5 展示了在不指定
useDocumentStyle
特性时,WSDL 文件的样子。它生成带“rpc”绑定样式和“literal”缺省编码的 WSDL
文件。WSAD V4.x 也生成这类 WSDL 文件。
使用这类 WSDL 文件,可以在 WSAD 中方便地创建 Java
代理。然而,.NET Framework SDK 中的 Microsoft WSDL 工具不接受这类 WSDL
文件样式;它只接受带“literal”缺省编码的 SOAP“document”绑定样式。
使用 WORF 的最新版本,我们可以用
useDocumentStyle
特性生成带“document”绑定样式的 WSDL 文件。我们已将这个带
true 值的特性添加到
dxx_prodinfo 组中的
group.properties 文件。
图 6
展示了“document style”WSDL 的样子,Microsoft WSDL 工具可以使用该文件。
图 6. 带 SOAP“document”绑定样式的 WSDL 文件
使用“document”样式的 WSDL 文件生成用于 ProdInfo DB2 DADX Web 服务的 .NET WSDL
代理。
- 确保 Tomcat 已经启动。
- 然后发出以下命令,以生成 C# WSDL 代理:
wsdl /nologo /language:cs /namespace:COM.ML
/out:ProdInfoProxy.cs
http://localhost:8080/services/db2prodinfo/
ProdInfoDadx.dadx/WSDL
|
- 使用以下命令来编译 C# WSDL 代理:
csc /nologo /out:ProdInfoProxy.dll /target:library
ProdInfoProxy.cs
|
基于 WSDL C# 代理,可以开发任何使用 DB2 DADX Web
服务的应用程序客户机。这里,我使用清单 2 中这个简单的基于控制台的 C#
程序作为样本。尽管它很简单,但对于本文演示已经足够了。还可以将此程序进一步开发成可重用的类,以用于复杂的应用程序开发。在
ProdInfoProxy.cs 代理中定义了这个程序所使用的几个类。
清单 2. 基于控制台的 C# 客户机代码
using System;
using System.Data;
using COM.ML;
public class ProdInfoClient {
public static void Main( )
{
QueryProdInfoResponse qRow;
QueryProdInfoResultQueryProdInfoRow[] pRecords;
string min_age;
string max_age;
string coverage;
string rate;
theService proxy = new theService();
QueryProdInfo qParm = new QueryProdInfo();
WriteMessage("Invoking Web Service Method through the
proxy.");
try
{
qParm.prod = "VGTLIFE";
qParm.state = "NJ";
qRow = proxy.QueryProdInfo(qParm);
pRecords = qRow.@return.QueryProdInfoResult;
for(int i=0; i < pRecords.Length; i ++)
{
min_age = pRecords[i].MIN_AGE.ToString();
max_age = pRecords[i].MAX_AGE.ToString();
coverage = pRecords[i].COVERAGE.ToString();
rate = pRecords[i].RATE.ToString();
WriteMessage(min_age + " " + max_age + " "
+ coverage + " " + rate);
}
}
catch(Exception e)
{Console.WriteLine("Threw general exception: {0}", e);}
}
private static void WriteMessage(string message) {
Console.WriteLine("Server returns: {0}", message);
}
}
|
- 将这个程序保存为
ProdInfoClient.cs 。
- 按如下编译该程序:
csc /nologo /out:ProdInfoClient.exe
/r:ProdInfoProxy.dll ProdInfoClient.cs
|
- 运行
ProdInfoClient.exe 。
图 7
展示了运行该程序的样子:.NET C# 客户机获得了与产品代码
VGTLIFE
和州代码
NJ 相对应的定期人寿保险利率。
图 7. 演示 .NET C# 客户机运行结果
在实际的系统开发中,定期人寿保险利率最有可能被存储成 .NET DataSet
对象。可以将它永久地保存在本地数据资源库或 XML 文件以备将来使用。由于这个最新的产品数据已被存储在本地数据存储,因此销售人员可以在与后端系统断开的情况下使用该智能客户机系统。
Web 服务提供程序可能涉及更复杂的 DB2 DADX Web 服务,其中用到了插入、更新、删除语句,或者甚至触发一个存储过程。不同操作会涉及一个或几个
DADX 文件。.NET 智能客户机可以与 Web 服务提供程序一起工作来形成新的计算范例。
结束语
在本文中,我向您展示了如何创建使用 B2 DADX Web 服务的 .NET C#
客户机。最新的 WORF 改善了 DB2 DADX Web 服务和 Microsoft .NET
平台之间的互操作性。通过 Web 服务将 DB2 与 .NET 智能客户机集成在一起,这展示了现在有新的机会可以提供更佳的业务解决方案。
参考资料
关于作者  | |  |
Henry Yu 是一位企业架构设计师,在开发大规模、复杂的企业范围的体系结构、OO
和客户机-服务器体系结构和大型机开发方面,他具有丰富的经验。他一直从事软件开发(尤其是金融方面的软件开发)的整个生命周期的业务和技术方面的研究。可以通过
j2ee_2000@yahoo.com与他联系。
|
对本文的评价
|