zoukankan      html  css  js  c++  java
  • 调用.NET XML Web Services返回数据集合一

    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中完成这一处理。

    该文章转载自1024k:http://www.1024k.cn/net/2007/200701/15386_2.html
      

  • 相关阅读:
    SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法
    译:SQL Server的Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
    SQLServer中间接实现函数索引或者Hash索引
    MySQL缓存分类和配置
    MySQL系统变量配置基础
    MySQL索引统计信息更新相关的参数
    Sql Server优化---统计信息维护策略
    SQL Server 用角色(Role)管理数据库权限
    sp_executesql 或者 EXECUTE 执行动态sql的权限问题
    关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别
  • 原文地址:https://www.cnblogs.com/newwind521/p/721200.html
Copyright © 2011-2022 走看看