【IT168技术文档】
1. 概述
很多正在开发或者打算开发XML Web Services的程序员都问过这样的一个问题:"我的Web Service返回的结果是一个DataSet类型的对象,但如果我的客户端不是用.NET写的(因而没有内建的DataSet类型),那该如何调用这个Web Service并访问DataSet中的数据呢?"。
对于这个问题,首先应该说的是:1)在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的。不管是在XML Web Services还是CORBA的环境中,都应该尽量使用简单数据类型以及简单数据类型的数组。2)应当很谨慎的决定是否需要通过Web Service来返回大量数据。由于网络传输的开销既包括HTTP连接建立的时间,也包括传送数据的时间,因此需要在减少访问服务器次数和减少网络传输量之间寻找一个合适的平衡。如非必须,则不适合通过Web Service传送含有几十条或者几百条数据的数据表。
然后,就问题本身而言,.NET Web Services返回的DataSet类型是可以直接被其他非.NET的客户端解析的,因为即便是DataSet类型的返回值,也会被表达成XML格式再进行传输。下面的例子就是一个返回类型为DataSet的Web Method,及其被调用后返回的XML格式数据:
表1. 返回类型为DataSet的Web Method
表2. 被格式化成XML的DataSet[WebMethod] public DataSet GetPersonData() { DataTable table=new DataTable("Person"); table.Columns.Add("Name"); table.Columns.Add("Gender"); table.Rows.Add(new string[2]{"Alice","Female"}); table.Rows.Add(new string[2]{"Bob","Male"}); table.Rows.Add(new string[2]{"Chris","Male"}); DataSet dataset=new DataSet("PersonTable"); dataset.Tables.Add(table); return dataset; }
<?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://tempuri.org/"> <xs:schema id="PersonTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="PersonTable" msdata:IsDataSet="true" msdata:Locale="zh-CN"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="Person"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="Gender" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <PersonTable xmlns=""> <Person diffgr:id="Person1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> <Name>Alice</Name> <Gender>Female</Gender> </Person> <Person diffgr:id="Person2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> <Name>Bob</Name> <Gender>Male</Gender> </Person> <Person diffgr:id="Person3" msdata:rowOrder="2" diffgr:hasChanges="inserted"> <Name>Chris</Name> <Gender>Male</Gender> </Person> </PersonTable> </diffgr:diffgram> </DataSet>