级别: 中级 Billy Lo (blo@ca.ibm.com), 高级 IT 架构师, IBM
2007 年 12 月 11 日 本文介绍如何使用 IBM® Rational® Application Developer for WebSphere® V7 创建事务 Web 服务提供程序,以及如何使用 Microsoft .NET 3.0 Software Development Kit 创建相应的服务使用程序。本文将向您介绍使用 WebSphere Application Server V6.1 和 Microsoft™ .NET™ Framework 进行开发所需要的步骤,其中包括针对两个平台的故障诊断提示和技巧。
引言
2005 年 8 月,IBM、Microsoft、IONA®、BEA® 和合作伙伴共同发布了一系列 Web 服务规范,该规范使应用程序能够以事务方式调用 Web 服务。这些规范包括:
- 处理短期事务活动的 WS-AtomicTransaction (WS-AT)。像使用其他事务系统(如 Java™ Transaction API (JTA) 或客户信息控制系统 (CICS))一样,您可以利用 WS-AT 来确保 Web 服务参与者进行的所有资源更新作为一个工作单元完成或回滚。
- WS-BusinessActivity (WS-BA) 可以解决长时间运行活动的协作问题并支持补偿概念。
- WS-Coordination (WS-Coor) 提供创建和交换事务上下文的基础机制。
WebSphere Application Server V6 和 V6.1、WebSphere Process Server V6、CICS Transaction Server V3.1 和 Microsoft .NET 3.0 Windows Communication Framework (WCF) 都支持 WS-AT。
本章将阐述 WS-AT 的基本概念,并指导您完成在 WebSphere Application Server 和 Microsoft .NET 3.0 之间构建事务 Web 服务的关键步骤。本文的目标读者是希望构建并部署跨不同平台的事务 Web 服务的 Web 服务开发人员、架构师和管理员。并且应该对 Java 编程、Web 服务开发、WSDL 和 SOAP 有基本的了解。
概述
WS-AT 通常用于协调 Web 服务参与者执行的活动,使所有的更新在单个工作单元中完成。例如,零售业可能需要保证有可用的库存并在发货之前收到付款。InventoryService、PaymentService 和 ShipmentService 可以驻留在使用异类技术堆栈的不同系统中,甚至可以跨组织边界。WS-AT 可以确保以事务方式执行对这三种 Web 服务的调用,并向应用程序提供原子性、一致性、隔离性和持久性 (ACID) 语义。
因为基础平台提供这一质量的服务,所以对于故障或超时条件,Web 服务开发人员无需开发自定义错误处理逻辑或进行手动撤消。
图 1 显示了一个示例,在该示例中,订单处理功能 (SubmitOrder.jsp) 使用 Web 服务调用以下三个服务提供程序来更新多个系统:InventoryService、PaymentService 和 ShipmentService。这些服务提供程序运行在不同的操作环境中,并访问不同的数据库和/或资源。借助 WS-AT,所有更新将通过一个全局事务进行协调。
图 1. 提供事务支持的订单处理示例
先决条件
要完成本文中的示例,您需要在 Microsoft Windows™ XP 平台上安装以下软件:
WS-AT 与操作系统和平台无关。例如,您可以使用在其他分布式平台(如 Linux、AIX 或 zOS)上运行的 WebSphere Application Server 以事务方式与在 Microsoft 平台(如 Windows Vista、Windows Server 2003 或 Windows XP)上运行的 Microsoft .NET 进行互操作。
WebSphere Application Server V6 用户必须使用 WebSphere Application Server V6.0.2.19 (或更高版本)来与使用 WS-AT 的 Microsoft .NET 进行互操作。
入门
图 2 概述了构建事务 Web 服务使用程序和提供程序的主要步骤。
图 2. 在 WebSphere 和 .NET 之间启用 WS-AT 的主要步骤
以下各部分将描述这些步骤。
步骤 1:使用 Rational Application Developer 开发事务 Web 服务提供程序
本文中的示例遵循自顶向下的方法。首先,我们将创建 WSDL 文档来描述服务接口 HelloWorldTX,然后生成服务实现,最后将介绍对服务端点的事务支持。
创建 WSDL 文档
若要承载服务提供程序,则需要使用适当的 Web 模块创建 Java® 2 Platform Enterprise Edition® (J2EE) 企业应用程序对象,具体操作如下:
- 在 Rational Application Developer 中启用 J2EE 和 Web 服务开发人员功能,方法是选择 Windows => Preferences => General => Capabilities,并选中 Web Developer 和 Web service Developer。
- 通过选择 File => New => Project 创建一个新的 J2EE 对象。选择 J2EE – Enterprise Application Project,并单击 Next。
- 输入
HelloWorldTX 作为 Project Name,选择 WebSphere Application Server v6.1 作为 Target Runtime,然后单击 Next。
- 接受 Project Facets 的缺省值,并单击 Next。
- 通过选择 New Module 创建新的 Web 模块。取消选中 Application Client Module、EJB Module 和 Connector Module,然后单击 Finish。
- 单击 Finish,完成 J2EE 对象的创建。
- 在 J2EE 透视图中,展开新的 HelloWorldTX 对象,右键单击 WebContent,选择 New => Other = > Web Services => WSDL,并单击 Next。
- 输入
HelloWorldTX.wsdl 作为 File Name,并单击 Next 和 Finish 接受缺省值。
- 下载示例 HelloWorldTX.wsdl,剪切内容并将其粘贴到新建的 HelloWorldTX.wsdl 文件中。
生成服务实现
要生成服务实现,请完成以下步骤:
- 右键单击 HelloWorldTX.wsdl,选择 Web Services => Generate Java bean skeleton,并单击 Finish。
- 将生成的 HelloWorldTXSOAPImpl.java 更改为
return “Hello, ” + in;。
启用 WS-AT 事务支持
在 WebSphere Application Server 中,WS-AT 事务支持是使用部署描述符指定的。不需要任何特殊 Java 代码。
- 展开 HelloWorldTXWeb => WebContent => WEB-INF,并打开 web.xml。
- 在 Servlets 选项卡上,选择 HelloWorldTXSOAPImpl Servlet。
- 向下滚动右侧的选项列表。在 WebSphere Extensions => Global Transaction 下,选中 Execute using Web Services Atomic Transaction on incoming requests。
- 按 Ctrl+S,保存对 Web 部署描述符 (web.xml) 的更改。
这将指示 WebSphere 运行时处理接收的任何 WS-AT 上下文,并在外部请求程序协调的全局事务下分派应用程序组件。
此时,HelloWorldTX Web 服务便可以使用了。
步骤 2:使用 Microsoft .NET Framework 3.0 开发事务 Web 服务使用程序
Microsoft .NET Framework 3.0 支持事务 Web 服务。服务使用程序可以是独立的 .NET 应用程序或者是在 Internet Information Services (IIS) 中运行的 Web 应用程序。在本文中,我们将构建访问 WebSphere 中的 HelloWorldTX 服务的独立 C# 客户机应用程序。
以下各步骤将描述如何使用 WSDL 文档从头构建 C# 客户机。还可以下载本文提供的预构建 .NET 客户机。
- 通过选择 Windows SDK => CMD Shell 启动 Windows SDK 命令 Shell。
- 创建工作目录存储客户机源代码(例如 C:\HelloWorldTXConsoleClient),并更改到该目录。
- 将 HelloWorldTX.wsdl 从 Rational Application Developer 工作区复制到工作目录。
- 通过发出以下命令生成 C# 代理类:
svcutil HelloWorldTX.wsdl。
- 将
TransactionFlowAttribute 属性添加到生成的 HelloWorldTX.cs 源文件,如清单 1 所示:
清单 1. C# 中的 HelloWorldTX 接口
public interface HelloWorldTX
{
// CODEGEN: Generating message contract since element name in from
namespace is not marked nillable
[System.ServiceModel.TransactionFlowAttribute(System.ServiceModel.Trans
actionFlowOption.Mandatory)]
[System.ServiceModel.OperationContractAttribute
Action="http://helloworldtx.example.wsat.ibm.com/
sayHello", ReplyAction="*")]
sayHelloResponse sayHello(sayHelloRequest request);
|
- 创建简单的 HelloWorldTXConsoleClient C# 类,以触发对 Web 服务操作的调用。清单 2 显示了一个示例 HelloWorldTXConsoleClient.cs。
清单 2. HelloWorldTXConsoleClient.cs
using System;
using System.Transactions;
namespace HelloWorldTXConsoleClient
{
class HelloWorldTXConsoleClient
{
static void Main(string[] args)
{
// start transaction
using (TransactionScope transScope = new
TransactionScope(TransactionScopeOption.RequiresNew))
{
HelloWorldTXClient proxy = new HelloWorldTXClient();
Console.WriteLine("Invoking HelloWorldTX service...");
// invoke HelloWorldTX running on WebSphere with WS-AT
String response = proxy.sayHello("World");
transScope.Complete();
Console.WriteLine("Transaction completed successfully.
Response = " + response);
}
}
|
- 为指定客户机端点和传输协议创建 HelloWorldTXConsoleClient.exe.config 文件,如清单 3 所示。此场景需要自定义绑定(而不是 .NET 中的标准 wsHttpBinding),因为 wsHttpBinding 缺省使用 SOAP 1.2。另一方面,WebSphere Application Server V6.1 支持 SOAP 1.1。
清单 3. HelloWorldTXConsoleClient.exe.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="Soap11AddressingBinding" transactionFlow="true">
<textMessageEncoding messageVersion="Soap11WSAddressing10" />
<transactionFlow transactionProtocol=
"WSAtomicTransactionOctober2004"/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:9080/
HelloWorldTXWeb/services/HelloWorldTXSOAP"
binding="customBinding"
bindingConfiguration="Soap11AddressingBinding"
contract="HelloWorldTX" name="HelloWorldTXSOAP" />
</client>
</system.serviceModel>
</configuration>
|
- 通过在 Windows SDK 命令 Shell 提示符处输入以下命令编译所有源文件:
csc HelloWorldTX.cs HelloWorldTXConsoleClient.cs /reference: "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll"; "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\System.Runtime.Serialization.dll".
- 确认 HelloWorldTXConsoleClient.exe 是否成功生成。

 |

|
步骤 3:在 Microsoft Distributed Transaction Coordinator (MSDTC) 中启用网络访问
在 Windows XP 中,在缺省情况下禁用对分布式事务和 WS-AT 的支持。要启用它,请执行以下操作:
- 安装 Update for Windows Communication Foundation (KB912817)。
- 安装 WS-AtomicTransaction Configuration MMC Snap-in (WsatUI.dll) (WsatUI.dll),并通过输入以下命令注册 DLL:
C:/> regasm /codebase "%PROGRAMFILES%\Microsoft SDKs\Windows\v6.0\Bin\WsatUI.dll"
- 通过执行以下操作启用 DTC 网络访问:
- 选择 Control Panel => Administrative Tools => Component Services。在 Console Root 下,展开 Component Services => Computers。
- 在 MMC 中右键单击 My Computer,选择 Properties,然后单击 MSDTC 选项卡。
- 单击 Security Configuration。
- 在 Security Configuration 对话框中,选中以下选项(如图 3 所示):Network DTC Access、Allow Remote Clients、Allow Inbound、Allow Outbound、Enable TIP Transactions 和 Enable XA Transactions。
图 3. 安全配置
- 单击 OK,然后再单击 OK 退出对话框。
步骤 4:为 WS-AT 消息交换设置 WebSphere 安全性、SSL 证书和事务服务
WebSphere Application Server 支持事务协议消息(例如 Register、Prepare、Commit 和 Rollback)的安全或非安全交换。不过,Microsoft .NET 需要使用 SSL 相互验证来保护协议消息。这意味着需要配置 SSL 安全性,并在 WS-AT 跨两个平台进行操作之前设置证书。
在生产环境中,将对每个参与者使用正式证书颁发机构的证书。不过,为了简单起见,在本示例中我们将为 WebSphere 和 .NET 生成自签名证书。为此,请完成以下操作步骤:
- 使用 WebSphere 管理控制台启用 WebSphere 全局安全性。在 Security => Secure administration, applications, and infrastructure 下,单击 Security Configuration Wizard。
- 选中 Enable Application Security,并单击 Next。
- 选择 Local Operating System,并单击 Next。
- 输入
<your-operating-system-userid> 作为 Primary administrative user name,并单击 Next。
- 单击 Finish。
- 使用管理控制台创建自签名证书,具体操作如下:
- 选择 Security => SSL certificate and key management => Key Store and Certificates => NodeDefaultKeyStore => Personal certificates => Create a self-signed certificate。
- 指定以下各值,然后单击 OK:
-
Alias =
<your_hostname>
-
Common Name =
<your_hostname>。(证书上的公用名必须与计算机的带有后缀的 DNS 名称匹配。)
-
Organization =
<your_organization_name>
- 单击 Save Changes to Master Configuration。
- 要将新建的证书指派为缺省值,请选择 Security => SSL certificate and key management > SSL configurations => NodeDefaultSSLSettings,然后为 Default server certificate alias 和 Default client certificate alias 选择新建的证书。然后单击 OK。
- 将签名者证书导入到信任存储,方法是选择 Security => SSL certificate and key management => Key stores and certificates,然后选择 NodeDefaultKeyStore 和 NodeDefaultTrustStore,并单击 Exchange signers。
- 选择新建的证书,并通过单击 Add,然后单击 OK 将其添加到 NodeDefaultTrustStore。
- 通过执行下面的操作配置 WebSphere 事务服务:
- 选择 Servers => Application servers => server1 => Container Services => Transaction Service。
- 取消选中 Enable protocol security。对于 .NET 互操作性必须禁用此选项。仍将使用 SSL 传输级别的安全性保护协议消息,但将禁用接收协议消息的基于角色的授权。传输协议消息的基于角色的授权仅支持 WebSphere 到 WebSphere 的交互。
- 对于 HTTPS proxy prefix,请输入
https://<your_websphere_server_hostname>:9443。如果没有使用缺省端口(为 WCInboundDefaultSecure Web 容器传输链配置的端口),则使用 SSL 入站端口替换 9443。注意:如果 WebSphere 服务器位于 HTTPS 代理后面,则应该使用 HTTPS 代理的主机名。
- 单击 OK。
- 此外,还应启用 WebSphere Web 服务消息跟踪以验证 WS-AT 是否正常运行。选择 Troubleshooting => Logs and Trace => server1 => Diagnostic Trace => Change Log Level Details,然后添加以下跟踪规范:
com.ibm.ws.webservices.trace.MessageTrace=finest,并单击 OK。
- 保存更改,并停止 WebSphere Application Server。
- 如果您正在使用 Rational Application Developer 或 WebSphere Application Server 工具包,请打开服务器配置,并展开 Security 部分。选中 Security is enabled on this server,并输入用于启用 WebSphere Global Security 的用户 ID 和密码。按 Ctrl+S,以保存更改。
- 重新启动 WebSphere Application Server。

 |

|
步骤 5:导入 SSL 证书,并在 Windows XP 中配置 WS-AT
MSDTC 负责事务管理和 WS-AT 消息的处理。可以按照下面的步骤配置 MSDTC。要使 WS-AT 工作,必须将 SSL 证书导入到 LocalMachine Certificate Store(而不是 User Certificate Stor),因为 MSDTC 流程要在不同的安全上下文中运行。
- 选择 Start => Run => mmc,打开 Microsoft 管理控制台。
- 在 MMC 中,选择 File => Add/Remove Snap-in => Add => Certificates => Add => Computer Account => Next => Local Computer => Finish => Close => OK。
- 展开 Certificates, Personal。
- 选择 Action, All Tasks, Import…, Next, Browse…
- Filename =
%WAS_HOME%\profiles\<your-server>\config\cells\<your-cell>\nodes\<your-node>\key.p12
- Password =
WebAS
- 将其放入 Personal Certificate Store,单击 Next,然后单击 Finish。
- 展开 Certificates, Trusted Root Certificate Authority,并重复上面的步骤 4,将证书导入到信任 CA 存储。
- 关闭 MMC。
- 单击 Start => Control Panel => Administrative Tools => Component Services => Computers => My Computer。
- 右键单击 My Computer,选择 Properties,然后选择 WS-AT 选项卡。在 WS-AT 选项卡上,请执行以下操作:
- 选中 Enable WS-Atomic Transaction network support。
- 在 Endpoint certificate 字段中,单击 Select,并选择新导入的证书(将主机名作为别名)。
- 在 Authorized certificates 字段中,单击 Select,如图 4 所示。
图 4. 配置 WS-AT
- 检查新创建的证书,并单击 OK,如图 5 所示。
图 5. 选择授权证书对话框
- 单击 OK,并根据提示重新启动 MSDTC。
步骤 6:测试端到端的消息流
现在可以测试 .NET 和 WebSphere 之间的端到端消息流了。通过从命令提示符运行 HelloWorldTXConsoleClient.exe 启动 .NET 客户机应用程序。如果一切工作正常,您应看到返回的 Hello, World 响应消息。
要验证事务消息交换是否发生,请打开 %WAS_HOME%/profiles/<your-server>/logs/server1/trace.log,并搜索 wsat,以查找 WS-AT 消息交换的详细跟踪信息。图 6 显示了消息流的整个序列。
图 6. .NET 和 WebSphere 之间的详细消息流
正如您看到的,需要多个 SOAP 消息交换才能处理事务 Web 服务调用。在本示例中,应用程序 SOAP 消息和 WS-AT 事务消息交换使用不同的端点 URL 和 TCP 端口。
故障诊断提示与技巧
如果遇到端到端的流问题,请检查 trace.log 中的 WebSphere MessageTrace,以查看消息交换的进度。下面是要检查的一些内容:
- 请求 1:来自 .NET 的应用程序请求是否包含 SOAP 标头和事务上下文?如果不包含,请确认客户机代码是否正在事务中运行,以及所需的 System.ServiceModel.TransactionFlowAttribute 是否已添加到生成的代理类 HelloWorldTX.cs。
- 请求 2:WebSphere Transaction Service 是否能够向 MSDTC 注册?如果不能,请验证请求 2 中的目标 URL 是否正确。它应该是
https://<your_hostname>/WsatService/Registration/Coordinator/。还要验证 SSL 证书设置过程是否在 Windows 和 WebSphere 管理控制台上成功完成。
- WebSphere WS-AT 和事务跟踪:使用 WebSphere 管理控制台启用此跟踪规范 (
WSCoor=all:Transaction=all) 以揭示事务握手中的任何问题。FFDC 目录中的异常信息在确定根本原因上也非常有用。
- MSDTC / WS-AT Transaction Bridge Trace:在 %windir%\system32 中创建名为 msdtc.exe.config 的文件,按照此 forum thread 中的描述捕捉事务握手的详细信息。
- 如果服务使用程序或服务提供程序更新任何资源(例如,使用 JDBC),请确保配置了符合 XA 的 JDBC 驱动器,并在应用程序逻辑中使用了 XADataSource。
结束语
WS-AT 实现了一组新的 Web 服务用例,这些用例以前非常难以实现。应用程序开发人员通过它避免了与远程 Web 服务调用相关的复杂事务错误和超时处理。
在本文中,您学习了 WS-AT 的基本概念,以及如何在异类 Web 服务环境中应用它。还学习了如何从 Microsoft .NET 环境以事务方式调用 WebSphere Web 服务,以及这两个平台上的一些常见问题解决技巧。
致谢
作者非常感谢以下人员,他们对本文提出了宝贵的意见:
- 英国 IBM Hursley Lab 的 WebSphere 事务架构师 Ian Robinson
- 英国 IBM Hursley Lab 的 WS-AT 开发员 Jon Hawkes
- 加拿大 IBM Global Business Services 的高级 I/T 专家 Jackie Paradis
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| HelloWorldTX Web services description | HelloWorldTX.wsdl | 3KB | HTTP |
|---|
| HelloWorldTXConsoleClient (.NET 3.0) | HelloWorldTXConsoleClient.zip | 5KB | HTTP |
|---|
| HelloWorldTX Service Provider (EAR) | HelloWorldTX.ear | 9KB | HTTP |
|---|
参考资料 学习
获得产品和技术
关于作者  | 
|  |
Billy Lo 在加拿大多伦多担任 IBM Global Business Services 的高级 I/T 架构师。他负责向客户提供有关如何使用 Web 服务技术在异类平台(如 WebSphere、CICS、Microsoft .NET、BEA WebLogic 和 Apache Axiso)上构建面向服务的业务应用程序的咨询工作。Billy 还经常在关于 Web 服务开发和互操作性的各种会议上发表演讲。您可以通过 blo@ca.ibm.com 与他联系。 |
对本文的评价
|