在WebLogic Workshop上使用.NET数据集
数据集(DataSet)是一种Microsoft活动数据对象(Microsoft Active Data object),用于实现一种常见的对数据的相关包装器(relational wrapper)。数据集将数据装在一套表中,这些表的结构跟SQL语言中表的结构很相似,这些表都有一些特定的列,按特定的次序排列,每列对应于一种特定类型。数据集对象为装载和操作数据提供了极大的便利。然而,考虑到本文的目的,我们对此不再赘述,而是将注意力放到数据集的串行化机制上来。
创建一个简单的数据集
一开始,我们要创建一个简单的用于描述一个电话本的数据集,并填上一些简单的示范数据。接着从一个Web服务中返回这个数据集,注意数据集是如何串行化到XML中的。
[WebMethod] public DataSet getDataSet()
{ // Create a new data set and add a table to it.
DataSet dataSet = new DataSet("MyDataSet");
DataTable table = dataSet.Tables.Add("PhoneBook");
// Create the columns of the table.
DataColumn primaryKeyCol = table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Telephone", typeof(string));
// Set the ID field as the primary key.
table.PrimaryKey = new DataColumn[] { primaryKeyCol };
// Create some bogus data.
table.LoadDataRow(new object[] {1, "Fred", "555.2145"}, true);
table.LoadDataRow(new object[] {2, "Bob", "555.6246"}, true);
table.LoadDataRow(new object[] {3, "Howard", "555.1125"}, true);
table.LoadDataRow(new object[] {4, "Stanley", "555.0932"}, true);
// Return the data set to the caller. return dataSet;}
这个数据集的规划很简单。数据集中只有一个名为“PhoneBook”的表,该表包含了三列。一列为ID,该列将作为关键字;一列为Name,还有一列为Telephone。在数据集中我们已经添加了一些简单的数据。当调用上述方法时,将返回以下XML:
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="MyDataSet" msdata:IsDataSet="true">
<xs:complexType> <xs:choice maxOccurs="unbounded">
<xs:element name="PhoneBook"> <xs:complexType>
<xs:sequence> <xs:element name="ID" type="xs:int" />
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Telephone" type="xs:string" minOccurs="0" />
</xs:sequence> </xs:complexType> </xs:element> </xs:choice>
</xs:complexType> <xs:unique name="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//PhoneBook" /> <xs:field xpath="ID" />
</xs:unique> </xs:element> </xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <MyDataSet xmlns="">
<PhoneBook diffgr:id="PhoneBook1" msdata:rowOrder="0">
<ID>1</ID> <Name>Fred</Name> <Telephone>555.2145</Telephone>
</PhoneBook>> <PhoneBook diffgr:id="PhoneBook2" msdata:rowOrder="1">
<ID>21</ID> <Name>Bob</Name> <Telephone>555.6246</Telephone>
</PhoneBook> <PhoneBook diffgr:id="PhoneBook3" msdata:rowOrder="2">
<ID>3</ID> <Name>Howard</Name>
<Telephone>555.1125</Telephone> </PhoneBook>
<PhoneBook diffgr:id="PhoneBook4" msdata:rowOrder="3">
<ID>4</ID> <Name>Stanley</Name>
<Telephone>555.0932</Telephone> </PhoneBook>
</MyDataSet> </diffgr:diffgram></DataSet>
这个数据集的XML编码分为两部分。一部分是规划,描述了XML编码的结构;另一部分是数据集的实体。本文将略去规划部分,假定规划是已知的,这里仅仅着重考虑数据编码本身。在一些更复杂的应用中,通过规划来做一些其他的事情通常是很有用的。
通过灵活地反复使用以下格式的元素,就可以将创建好的表中的数据编码成非常简单的格式:
<PhoneBook> <ID></ID> <Name></Name> <Telephone></Telephone></PhoneBook>
如果我们已经知道了XML的形式,就可以编写一个能获取并使用这些数据的WebLogic Workshop Web服务。
用XML映像(XML Map)提取数据
通过WebLogic Workshop的XML映射技术,我们可以提取这些数据,并将其存入到用于表示电话本实体的Java对象中。下面的代码将完成这项工作:
public static class PhoneBookEntry{ public int id; public String name; public String phoneNumber;}
为了对引入的XML进行解码,我们将用到一个XML映像。以下XML映像可以作为服务控件的返回映像,这个服务控件是用于调用可返回数据集的.NET Web 服务的。
/** * @jws:return-xml xml-map:: *
<getDataSetResponse xmlns="http://tempuri.org/"> * <getDataSetResult> *
<diffgr:diffgram * xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
* <MyDataSet xmlns=""> * <PhoneBook xm:multiple="entry in return">
* <ID>{entry.id}</ID> * <Name>{entry.name}</Name> *
<Telephone>{entry.telephone}</Telephone> * </PhoneBook> *
</MyDataSet> * </diffgr:diffgram> * </getDataSetResult> *
</getDataSetResponse> * :: */public PhoneBookEntry[] getDataSet();
该映像需添加到.NET Web服务对应的CTRL文件中的getDataSet方法中。这个映像看起来可能有些复杂,但这的的确确就是要演化为.NET Web服务返回的用于获取电话本条目部分的XML。接着用一个xm:multiple属性将每个电话本条目的数据绑定到由映像-增强(map-enhanced)getDataSet返回的一个数组的元素上。
你可能已经注意到,这个映像建议的XML形式与之前我展示过的那个映像略有出入。不幸的是,WebLogic Workshop收到的SOAP消息看上去与.NET的Web界面所显示的XML形式有所不同。你可以通过在WebLogic Workshop上的Web服务中调用.NET的Web服务方法来找到WebLogic Workshop所收到的消息,并使用测试视图查看.NET返回的XML形式。
结论
互操作性在Web服务中非常重要,而通过WebLogic Workshop可以非常容易地实现对其他Web服务的互操作。在本文中我们讨论了为实现对.NET的互操作需要做那些工作,实际上,这些原理同样适用于其他任何可以产生有效WSDL的Web服务产品。
网络医生成长记:网络故障快速定位
0
相关文章