IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

在 WebSphere Application Server 和 Microsoft .NET 中使用 WS-AtomicTransaction 构建事务 Web 服务

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

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. 提供事务支持的订单处理示例
图 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 的主要步骤
图 2. 在 WebSphere 和 .NET 之间启用 WS-AT 的主要步骤

以下各部分将描述这些步骤。





回页首


步骤 1:使用 Rational Application Developer 开发事务 Web 服务提供程序

本文中的示例遵循自顶向下的方法。首先,我们将创建 WSDL 文档来描述服务接口 HelloWorldTX,然后生成服务实现,最后将介绍对服务端点的事务支持。

创建 WSDL 文档

若要承载服务提供程序,则需要使用适当的 Web 模块创建 Java® 2 Platform Enterprise Edition® (J2EE) 企业应用程序对象,具体操作如下:

  1. 在 Rational Application Developer 中启用 J2EE 和 Web 服务开发人员功能,方法是选择 Windows => Preferences => General => Capabilities,并选中 Web DeveloperWeb service Developer
  2. 通过选择 File => New => Project 创建一个新的 J2EE 对象。选择 J2EE – Enterprise Application Project,并单击 Next
  3. 输入 HelloWorldTX 作为 Project Name,选择 WebSphere Application Server v6.1 作为 Target Runtime,然后单击 Next
  4. 接受 Project Facets 的缺省值,并单击 Next
  5. 通过选择 New Module 创建新的 Web 模块。取消选中 Application Client ModuleEJB ModuleConnector Module,然后单击 Finish
  6. 单击 Finish,完成 J2EE 对象的创建。
  7. 在 J2EE 透视图中,展开新的 HelloWorldTX 对象,右键单击 WebContent,选择 New => Other = > Web Services => WSDL,并单击 Next
  8. 输入 HelloWorldTX.wsdl 作为 File Name,并单击 NextFinish 接受缺省值。
  9. 下载示例 HelloWorldTX.wsdl,剪切内容并将其粘贴到新建的 HelloWorldTX.wsdl 文件中。

生成服务实现

要生成服务实现,请完成以下步骤:

  1. 右键单击 HelloWorldTX.wsdl,选择 Web Services => Generate Java bean skeleton,并单击 Finish
  2. 将生成的 HelloWorldTXSOAPImpl.java 更改为 return “Hello, ” + in;

启用 WS-AT 事务支持

在 WebSphere Application Server 中,WS-AT 事务支持是使用部署描述符指定的。不需要任何特殊 Java 代码。

  1. 展开 HelloWorldTXWeb => WebContent => WEB-INF,并打开 web.xml
  2. Servlets 选项卡上,选择 HelloWorldTXSOAPImpl Servlet。
  3. 向下滚动右侧的选项列表。在 WebSphere Extensions => Global Transaction 下,选中 Execute using Web Services Atomic Transaction on incoming requests
  4. 按 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 客户机。

  1. 通过选择 Windows SDK => CMD Shell 启动 Windows SDK 命令 Shell。
  2. 创建工作目录存储客户机源代码(例如 C:\HelloWorldTXConsoleClient),并更改到该目录。
  3. 将 HelloWorldTX.wsdl 从 Rational Application Developer 工作区复制到工作目录。
  4. 通过发出以下命令生成 C# 代理类: svcutil HelloWorldTX.wsdl
  5. 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);
    

  6. 创建简单的 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);
                }
            }
    
    

  7. 为指定客户机端点和传输协议创建 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>
    

  8. 通过在 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".
  9. 确认 HelloWorldTXConsoleClient.exe 是否成功生成。




回页首


步骤 3:在 Microsoft Distributed Transaction Coordinator (MSDTC) 中启用网络访问

在 Windows XP 中,在缺省情况下禁用对分布式事务和 WS-AT 的支持。要启用它,请执行以下操作:

  1. 安装 Update for Windows Communication Foundation (KB912817)
  2. 安装 WS-AtomicTransaction Configuration MMC Snap-in (WsatUI.dll) (WsatUI.dll),并通过输入以下命令注册 DLL:
    C:/> regasm /codebase "%PROGRAMFILES%\Microsoft SDKs\Windows\v6.0\Bin\WsatUI.dll"
  3. 通过执行以下操作启用 DTC 网络访问:
    • 选择 Control Panel => Administrative Tools => Component Services。在 Console Root 下,展开 Component Services => Computers
    • MMC 中右键单击 My Computer,选择 Properties,然后单击 MSDTC 选项卡。
    • 单击 Security Configuration
    • 在 Security Configuration 对话框中,选中以下选项(如图 3 所示):Network DTC AccessAllow Remote ClientsAllow InboundAllow OutboundEnable TIP TransactionsEnable XA Transactions

      图 3. 安全配置
      图 3. 安全配置

    • 单击 OK,然后再单击 OK 退出对话框。




回页首


步骤 4:为 WS-AT 消息交换设置 WebSphere 安全性、SSL 证书和事务服务

WebSphere Application Server 支持事务协议消息(例如 Register、Prepare、Commit 和 Rollback)的安全或非安全交换。不过,Microsoft .NET 需要使用 SSL 相互验证来保护协议消息。这意味着需要配置 SSL 安全性,并在 WS-AT 跨两个平台进行操作之前设置证书。

在生产环境中,将对每个参与者使用正式证书颁发机构的证书。不过,为了简单起见,在本示例中我们将为 WebSphere 和 .NET 生成自签名证书。为此,请完成以下操作步骤:

  1. 使用 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
  2. 使用管理控制台创建自签名证书,具体操作如下:
    • 选择 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
  3. 要将新建的证书指派为缺省值,请选择 Security => SSL certificate and key management > SSL configurations => NodeDefaultSSLSettings,然后为 Default server certificate aliasDefault client certificate alias 选择新建的证书。然后单击 OK
  4. 将签名者证书导入到信任存储,方法是选择 Security => SSL certificate and key management => Key stores and certificates,然后选择 NodeDefaultKeyStoreNodeDefaultTrustStore,并单击 Exchange signers
  5. 选择新建的证书,并通过单击 Add,然后单击 OK 将其添加到 NodeDefaultTrustStore。
  6. 通过执行下面的操作配置 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
  7. 此外,还应启用 WebSphere Web 服务消息跟踪以验证 WS-AT 是否正常运行。选择 Troubleshooting => Logs and Trace => server1 => Diagnostic Trace => Change Log Level Details,然后添加以下跟踪规范: com.ibm.ws.webservices.trace.MessageTrace=finest,并单击 OK
  8. 保存更改,并停止 WebSphere Application Server。
  9. 如果您正在使用 Rational Application Developer 或 WebSphere Application Server 工具包,请打开服务器配置,并展开 Security 部分。选中 Security is enabled on this server,并输入用于启用 WebSphere Global Security 的用户 ID 和密码。按 Ctrl+S,以保存更改。
  10. 重新启动 WebSphere Application Server。




回页首


步骤 5:导入 SSL 证书,并在 Windows XP 中配置 WS-AT

MSDTC 负责事务管理和 WS-AT 消息的处理。可以按照下面的步骤配置 MSDTC。要使 WS-AT 工作,必须将 SSL 证书导入到 LocalMachine Certificate Store(而不是 User Certificate Stor),因为 MSDTC 流程要在不同的安全上下文中运行。

  1. 选择 Start => Run => mmc,打开 Microsoft 管理控制台。
  2. 在 MMC 中,选择 File => Add/Remove Snap-in => Add => Certificates => Add => Computer Account => Next => Local Computer => Finish => Close => OK
  3. 展开 Certificates, Personal
  4. 选择 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
  5. 展开 Certificates, Trusted Root Certificate Authority,并重复上面的步骤 4,将证书导入到信任 CA 存储。
  6. 关闭 MMC。
  7. 单击 Start => Control Panel => Administrative Tools => Component Services => Computers => My Computer
  8. 右键单击 My Computer,选择 Properties,然后选择 WS-AT 选项卡。在 WS-AT 选项卡上,请执行以下操作:
    • 选中 Enable WS-Atomic Transaction network support
    • Endpoint certificate 字段中,单击 Select,并选择新导入的证书(将主机名作为别名)。
    • Authorized certificates 字段中,单击 Select,如图 4 所示。

      图 4. 配置 WS-AT
      图 4. 配置 WS-AT

    • 检查新创建的证书,并单击 OK,如图 5 所示。

      图 5. 选择授权证书对话框
      图 5. 选择授权证书对话框

  9. 单击 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 之间的详细消息流
图 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 descriptionHelloWorldTX.wsdl3KBHTTP
HelloWorldTXConsoleClient (.NET 3.0)HelloWorldTXConsoleClient.zip5KBHTTP
HelloWorldTX Service Provider (EAR)HelloWorldTX.ear9KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术


关于作者

Author1 photo

Billy Lo 在加拿大多伦多担任 IBM Global Business Services 的高级 I/T 架构师。他负责向客户提供有关如何使用 Web 服务技术在异类平台(如 WebSphere、CICS、Microsoft .NET、BEA WebLogic 和 Apache Axiso)上构建面向服务的业务应用程序的咨询工作。Billy 还经常在关于 Web 服务开发和互操作性的各种会议上发表演讲。您可以通过 blo@ca.ibm.com 与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款