惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

博客园 - Edison Zhu

Zhuanzai: change Asp.net Themes dynamicly (Setting An ASP.NET Theme in the PreInit Event Handler) zhuanzai: AJAX: How to create a "Processing" modal window using UpdateProgress and ModalPopup ASP.net AJAX controls - Edison Zhu 转:Manage Web.config from XML File by using configSource attribute ASP.Net 2.0 [转载] 微软SQL Server事务隔离级别实例简介 [转载] Moving table to a different filegroup in SQL 2005 [转载] SQL SERVER – 2005 – Database Table Partitioning Tutorial – How to Horizontal Partition Database Table [转载] SQL SERVER – 2005 – Introduction to Partitioning 转载:.NET Programming Standards and Naming Conventions [引]:聚集索引与非聚集索引 Trouble Shooting: can not access Excel file using excel control C#中小数点后保留两位小数,四舍五入的函数及使用方法 关于锁 IE7下关闭窗口不弹出提示窗口方法 [转]ASP.NET如何在客户端调用服务端代码 [转]谈谈Cookie存取和IE页面缓存的问题 Operate File [转] 客户端的JavaScript脚本中获取服务器端控件的值 及ID BULK INSERT Temporary Tables
[转]调用.NET XML Web Services返回数据集合
Edison Zhu · 2007-10-27 · via 博客园 - Edison Zhu

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
  [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;
  }
  
  表2. 被格式化成XML的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>
  
  从上面的例子可以看出,直接使用DataSet作为返回类型,其结果是相当复杂的,其中不但包含了DataSet中的数据,还包括了数据更改的信息,以及DataSet的Schema。虽然有些工具能够生成一个类似DataSet的客户端类型,但无论是直接解析复杂的XML还是使用类似DataSet的类,都不够直接不够清晰。
  
  解决这个问题的方案有两种:
  
  1) 用简单数据类型构造自定义类型,用每一个自定义类型对象封装数据集中的一行,将自定义类型对象的数组(Array)返回客户端;由于是用简单数据类型定义,客户端能够完全不变的还原出自定义类型的定义;
  
  2) 用DataSet.WriteXML()方法将数据集中的数据提取成XML格式,并以字符串的形式返回给客户端,再由客户端解析XML字符串,还原出数据。由于使用WriteXML()的时候能够过滤掉冗余信息,返回的内容和图表2中的内容相比大大简化了。
  
  2. 创建.NET Web Services,返回数据集合
  
  借助于Visual Studio.NET,只需编写Web Method本身的代码,即可非常快速的创建可以实用的Web Services:
  
  表3. 用.NET实现的XML Web Services
  [WebMethod]
  public Person[] GetPersons()
  {
  Person Alice=new Person("Alice","Female");
  Person Bob=new Person("Bob","Male");
  Person Chris=new Person("Chris","Female");
  Person Dennis=new Person("Dennis","Male");
  
  return new Person[]{Alice,Bob,Chris,Dennis};
  }
  
  [WebMethod]
  public string GetPersonTable()
  {
  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","Female"});
  table.Rows.Add(new string[2]{"Dennis","Male"});
  table.Rows.Add(new string[2]{"Eric","Male"});
  
  DataSet dataset=new DataSet("PersonTable");
  dataset.Tables.Add(table);
  
  System.Text.StringBuilder strbuilder=new System.Text.StringBuilder();
  StringWriter writer=new StringWriter(strbuilder);
  dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
  
  return strbuilder.ToString();
  }
  
  在上面的代码中,函数GetPersons()和GetPersonTable()分别对应于"1. 概述"中所提到的两种解决方案。其中,Person类型就是用于封装数据集中一行数据的自定义的数据类型:

 表4. 自定义类型Person
  [Serializable]
  public class Person
  {
  public Person()
  {
  }
  
  public Person(string name,string gender)
  {
  this.Name=name;
  this.Gender=gender;
  }
  
  public string Name="";
  public string Gender="";
  }

下面就是在Internet Exploerer里直接调用这两个Web Method所得到的XML格式的结果:
  
  表5. GetPersons()的返回结果
  <?xml version="1.0" encoding="utf-8"?>
  <ArrayOfPerson xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://tempuri.org/">
  <Person>
  <Name>Alice</Name>
  <Gender>Female</Gender>
  </Person>
  <Person>
  <Name>Bob</Name>
  <Gender>Male</Gender>
  </Person>
  <Person>
  <Name>Chris</Name>
  <Gender>Female</Gender>
  </Person>
  <Person>
  <Name>Dennis</Name>
  <Gender>Male</Gender>
  </Person>
  </ArrayOfPerson>
  
  表6. GetPersonTable()的返回的String类型的值
  <PersonTable> <Person>
  <Name>Alice</Name>
  <Gender>Female</Gender>
  </Person> <Person>
  <Name>Bob</Name>
  <Gender>Male</Gender>
  </Person> <Person>
  <Name>Chris</Name>
  <Gender>Female</Gender>
  </Person> <Person>
  <Name>Dennis</Name>
  <Gender>Male</Gender>
  </Person> <Person>
  <Name>Eric</Name>
  <Gender>Male</Gender>
  </Person> </PersonTable>
  
  到这里,XML Web Service的创建就已经完成了。.NET中创建的XML Web Services遵循的是统一的行业标准(SOAP、XML等),因此无论使用.NET语言还是使用非.NET语言,都可以调用它。尤其对于GetPersonTable()返回的结果来说,只要用XML Parser作简单的处理,就能把数据提取出来。下面就将演示如何在Java中完成这一处理。

其他相关资源:
使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型:
http://www.cnblogs.com/dflying/archive/2007/06/13/781183.html