|
<p >接上一篇:集成J2EE和.NET Web服务(二)<p ><B>从J2EE客户端调用.NET Web服务</B><p >在这里,我需要证明J2EE Web服务客户端可以调用.NET Web服务。在这个例子中,我没有一个预先存在的.NET应用程序,因此我从头开始创建一个.NET Web服务。<p ><I>创建.NET Web服务</I><p >我决定重新创建相同的Orders应用程序,因为我已经知道这个应用程序在J2EE上是如何工作的。首先我使用Microsoft Access创建一个新的数据库用于复制表。其次,我增加ADO.NET对象用于访问数据库并且通过一个Web服务页面Orders.asmx 来显示那些方法。 <p ><img src="http://www.hh010.com/upload_files/article/244/9_x8ipgc305445.gif"><p >为了使得方法通过Web服务接口可以访问,我在方法签名的前面增加[Web Method]指示符。DataSet类型是一个新的数据类型,当前只是在.NET语言中可以使用。这意味着Web服务客户端必须能够将该数据类型转换成实现语言中的等价类型。在该实例中,J2EE客户端必须能够将DataSet类型转换成Java的等价类型。 <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>[ WebMethod ] public DataSet getOrdersByCustomer(int customerNbr) { DataSet ds = new DataSet("OrderSet"); oleDbDataAdapter1.SelectCommand.CommandText = "SELECT OrderNumber,CustomerName,ExpectedShipDate FROM OrderMaster WHERE CustomerNbr=" + customerNbr + " ORDER BY OrderNumber"; oleDbDataAdapter1.Fill(ds,"Orders"); return ds; }</ccid_code></pre></td></tr></table></ccid_nobr><p ><B>为.NET Orders Web服务创建J2EE客户端</B><p >接下来,我开始为.NET Orders Web服务创建J2EE客户端。在WebLogic Workshop和Visual Studio .NET 之间的大部分步骤是相同的,但是它们的实现方式有轻微的差异。为了创建客户代理,WebLogic Workshop还需要WSDL文档,但是在我可以从WSDL文档为.NET Web服务创建服务控制之前,必须首先将WSDL文档加入到lib目录。在下面的代码片断中,我创建了服务控制(Service Control)的一个实例,创建了映射到Web服务方法的方法,然后调用该方法。<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>private OrdersNETControl OrdersNETClient; public Node getOrdersByCustomer(int customerNbr) { return (Node) OrdersNETClient.getOrdersByCustomer(customerNbr); }</ccid_code></pre></td></tr></table></ccid_nobr><p >注意,WebLogic Workshop 期望从.NET Orders Web服务返回一个节点(Node)。为了能够扩展数据值,Workshop将.NET的DataSet数据类型映射到一个普通的XML文档节点。这在理解上仍然有些小麻烦。我不得不查看WebLogic Workshop所生成的Control文件来揭示它。 <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>OrdersNETControl.control /** @editor-info:link source="OrdersNET.wsdl" autogen="true" */ import Weblogic.jws.control.ServiceControl; /** * @jws:location http-url="http://localhost/OrderRetrieval/Service1.asmx" * @jws:wsdl file="#OrdersNETWsdl" */ public interface OrdersNETControl extends ServiceControl { public org.w3c.dom.Node getOrdersByEmployee (java.lang.String EmployeeID); ... }</ccid_code></pre></td></tr></table></ccid_nobr><p ><I>请求和应答代码</I><p >现在我具有一个客户端和一个Web服务,让我们看看当我向Web服务发送一个请求时发生什么。通过Web服务,SOAP消息以同步或者异步方式被来回传送。这里我只是显示SOAP消息的一部分,它是与我正在调用的Web服务方法相关联的。我调用getOrdersByCustomer方法并且向它传递一个值为200的customerNbr参数。<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code><getOrdersByCustomer xmlns="http://tempuri.org/"> <customerNbr>200</customerNbr> </getOrdersByCustomer> Fragment 9 - Request XML message在来自Web服务的应答中,我获得一个Orders数组,它表示customerNbr为200的所有订单。<ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr> <td bgcolor="e6e6e6" class="code" style="font-size:9pt"> <pre><ccid_code> <OrderSet xmlns=""> <Orders diffgr:id="Orders1" msdata:rowOrder="0"> <OrderNumber>2</OrderNumber> <CustomerName>Set in Place</CustomerName> <ExpectedShipDate>2002-10-02</ExpectedShipDate> </Orders> </OrderSet></ccid_code></pre></td></tr></table></ccid_nobr><p ><B>需要考虑的问题和结束语</B><p >基本Web服务的SOAP和WSDL的互操作性可以通过下列步骤来证明:<BR><li>J2EE客户端可以调用.NET Web服务。<BR><li>J2EE客户端可以使用.NET WSDL文档来创建存根。<BR><li> .NET客户端可以调用J2EE Web服务。<BR><li>.NET客户端可以使用J2EE WSDL文档来创建存根。<p >要增强J2EE和.NET之间的互操作性,业界还需要采取更多的步骤。首先,应该增加对于所有XML Schema类型的支持。例如,在Java语言中,XML Schema类型选择并没有标准的等价体。其次,对于并不具有一个等价的Java类型的.NET数据类型,应该增加相应的支持。ADO.NET的DataSet类型也没有等价的Java类型。根据我的经验,WebLogic Workshop将一个DataSet转换成一个普通的XML节点,然后在Java上进行分析以提取出DataSet值。第三,对于Microsoft已经增加到它们的SOAP实现中的扩展,应该在J2EE中增加相应的支持。<p >WSDL是服务互操作性的核心,并且一个公共的WSDL接口可以增加重用。由于WSDL定义了Web服务所期望的数据类型,它允许SOAP客户端与Web服务的互操作性。J2EE和.NET都有一些可用的工具用于生成客户端的代理,它向开发人员隐藏一定层次的复杂性。其他的最佳实践包括严格遵循广泛接受的标准(例如,SOAP 1.2),尽可能保持数据类型的简单性,以及为所有数据类型提供XML Schema定义。<p >在.NET或者J2EE中都可以成功地编写Web服务。今天,在J2EE和.NET之间的简单互操作性是可能的,并且还从互操作性标准团体那里得到持续的增强。使用易于序列化的公共数据类型使得开发人员的工作更加容易。根据您的编程背景,学习一门新语言或者一种新编程范型有可能是必要的。<p ><B>关于作者</B><p >Evelyn Hobson是HP开发人员资源组织的软件工程师和顾问,该组织探索与开发人员相关的前沿技术。她感兴趣的领域包括XML、J2EE、.NET和Web服务。<p > <p align="center"></p></p> |
|