【转】java 访问.net webservice返回的数据集

转自【转的也是转的】【http://blog.csdn.net/fox123871/article/details/8637839】

1. 概述
  
  很多正在开发或者打算开发XML Web Services的程序员都问过这样的一个问题:"我的WebService返回的结果是一个DataSet类型的对象,但如果我的客户端不是用.NET写的(因而没有内建的DataSet类型),那该如何调用这个WebService并访问DataSet中的数据呢?"。
  
  对于这个问题,首先应该说的是:1)在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的。不管是在XMLWebServices还是CORBA的环境中,都应该尽量使用简单数据类型以及简单数据类型的数组。2)应当很谨慎的决定是否需要通过WebService来返回大量数据。由于网络传输的开销既包括HTTP连接建立的时间,也包括传送数据的时间,因此需要在减少访问服务器次数和减少网络传输量之间寻找一个合适的平衡。如非必须,则不适合通过WebService传送含有几十条或者几百条数据的数据表。
  
  然后,就问题本身而言,.NET WebServices返回的DataSet类型是可以直接被其他非.NET的客户端解析的,因为即便是DataSet类型的返回值,也会被表达成XML格式再进行传输。下面的例子就是一个返回类型为DataSet的WebMethod,及其被调用后返回的XML格式数据:
  
  表1. 返回类型为DataSet的Web Method

 1 [WebMethod]
 2   public DataSet GetPersonData()
 3   {
 4   DataTable table=new DataTable("Person");
 5   table.Columns.Add("Name");
 6   table.Columns.Add("Gender");
 7   table.Rows.Add(new string[2]{"Alice","Female"});
 8   table.Rows.Add(new string[2]{"Bob","Male"});
 9   table.Rows.Add(new string[2]{"Chris","Male"});
10   
11   DataSet dataset=new DataSet("PersonTable");
12   dataset.Tables.Add(table);
13   return dataset;
14   }

表2. 被格式化成XML的DataSet

 1 <?xml version="1.0"encoding="utf-8"?>
 2   <DataSetxmlns="http://tempuri.org/">
 3   <xs:schema id="PersonTable" xmlns=""xmlns:xs="http://www.w3.org/2001/XMLSchema"
 4   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 5   <xs:element name="PersonTable"msdata:IsDataSet="true" msdata:Locale="zh-CN">
 6   <xs:complexType>
 7   <xs:choicemaxOccurs="unbounded">
 8   <xs:element name="Person">
 9   <xs:complexType>
10   <xs:sequence>
11   <xs:element name="Name" type="xs:string"minOccurs="0" />
12   <xs:element name="Gender" type="xs:string"minOccurs="0" />
13   </xs:sequence>
14   </xs:complexType>
15   </xs:element>
16   </xs:choice>
17   </xs:complexType>
18   </xs:element>
19   </xs:schema>
20   <diffgr:diffgramxmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
21   xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
22   <PersonTable xmlns="">
23   <Person diffgr:id="Person1" msdata:rowOrder="0"diffgr:hasChanges="inserted">
24   <Name>Alice</Name>
25   <Gender>Female</Gender>
26   </Person>
27   <Person diffgr:id="Person2" msdata:rowOrder="1"diffgr:hasChanges="inserted">
28   <Name>Bob</Name>
29   <Gender>Male</Gender>
30   </Person>
31   <Person diffgr:id="Person3" msdata:rowOrder="2"diffgr:hasChanges="inserted">
32   <Name>Chris</Name>
33   <Gender>Male</Gender>
34   </Person>
35   </PersonTable>
36   </diffgr:diffgram>
37   </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本身的代码,即可非常快速的创建可以实用的WebServices:
  
  表3. 用.NET实现的XML Web Services

 1 [WebMethod]
 2   public Person[] GetPersons()
 3   {
 4      Person Alice=newPerson("Alice","Female");
 5      Person Bob=newPerson("Bob","Male");
 6      Person Chris=newPerson("Chris","Female");
 7      Person Dennis=newPerson("Dennis","Male");
 8   
 9      return newPerson[]{Alice,Bob,Chris,Dennis};
10   }
11   
12   [WebMethod]
13   public string GetPersonTable()
14   {
15       DataTabletable=new DataTable("Person");
16      table.Columns.Add("Name");
17      table.Columns.Add("Gender");
18      table.Rows.Add(new string[2]{"Alice","Female"});
19      table.Rows.Add(new string[2]{"Bob","Male"});
20      table.Rows.Add(new string[2]{"Chris","Female"});
21      table.Rows.Add(new string[2]{"Dennis","Male"});
22       table.Rows.Add(newstring[2]{"Eric","Male"});
23   
24       DataSetdataset=new DataSet("PersonTable");
25      dataset.Tables.Add(table);
26   
27       System.Text.StringBuilderstrbuilder=new System.Text.StringBuilder();
28      StringWriter writer=new StringWriter(strbuilder);
29      dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
30   
31       returnstrbuilder.ToString();
32   }

  在上面的代码中,函数GetPersons()和GetPersonTable()分别对应于"1.概述"中所提到的两种解决方案。其中,Person类型就是用于封装数据集中一行数据的自定义的数据类型:
  
  表4. 自定义类型Person

 1 [Serializable]
 2   public class Person
 3   {
 4      public Person()
 5      {
 6      }
 7   
 8      public Person(stringname,string gender)
 9      {
10        this.Name=name;
11        this.Gender=gender;
12      }
13   
14      public string Name="";
15      public stringGender="";
16   }
时间: 2024-10-19 01:27:36

【转】java 访问.net webservice返回的数据集的相关文章

java 判断RUL访问是否有效返回状态

package com.ddln.test; import java.net.HttpURLConnection; import java.net.URL; public class URLConnect { private static URL url; private static HttpURLConnection con; private static int state = -1; /** * 功能:检测当前URL是否可连接或是否有效, * 描述:链接url地址,链接失败则返回null

java访问PHP写的webService的方法—基于axis框架 .

java访问PHP写的webService的方法—基于axis框架 http://blog.csdn.net/longxia1987/article/details/6435764

Webservice 返回数据集 DataSet

一.服务端 New TSoapDataModule 添加控件 TDataSetProvider,TClientDataSet,TADOQuery,TADOConnection 添加方法 function TsoapTest.Getdata(const sql: UTF8String): Variant;begin  dm.ADOQuery1.Close;  dm.ADOQuery1.sql.Text := 'select top 50 * from mz';  dm.ADOQuery1.Open

Java访问远程服务

随着webService的崛起,我们开始中会越来越多的使用到访问远程webService服务.当然对于不同的webService框架一般都有自己的client包供使用,但是如果使用webService框架自己的client包,那么必然需要在自己的代码中引入它的包,如果同时调运了多个不同框架的webService,那么就需要同时引入多个不同的client包,这样做是很烦的.Java本生提供访问远程服务的包,在java.net.*下.接下来我们就用Java原生的package访问webService

JQuery请求WebService返回数据的几种处理方式

打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理解和解决方案.对于webservice大家肯定知道,它是一种使不同站点之间可以相互通信的技术,可以理解为一种接口.一个站点可以通过其它站点提供的webservice接口获得其它站点提供的相应服务.webservice使用起来非常小巧,轻便被很多站点所使用.对于webservice我不做过多说明,we

三国武将查询系统 //Java 访问 数据库

import java.awt.*; import javax.swing.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.ImageIcon; import javax.swing.JTextArea; import javax.swing.JLabel; import java.awt.Color; import java.sql.*; import

如何使用Java访问双向认证的Https资源

本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 0.Nginx配置Https双向认证 首先配置Https双向认证的服务器资源. 可以参考:http://www.cnblogs.com/dreamingodd/p/7357029.html 完成之后如下效果: 1.导入cacerts进行访问 首先将服务器证书导入keystore cacerts,默认密码为changeit,如果需要修改密码就改一下. keytool -impor

Java调用doNet webService方法

doNet的webService 浏览器访问测试地址:http://192.168.4.17/JLWWS/sendCommand.asmx,出现 点击getDeviceValue方法,出现 上图的xml代码再贴一遍: POST /JLWWS/sendCommand.asmx HTTP/1.1 Host: 192.168.4.17 Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tem

JAVA访问修饰符 构造函数的问题(转)

JAVA访问修饰符 构造函数的问题 java访问修饰符-限定符总结(类比C#) JAVA访问修饰符----------[public | default | protected | private ] public: 完全开发protected: 同包及子类访问default(无): 同包访问private: 只能本类访问 JAVA用于类的修饰符(2个)和限定符(2个):---------------public: 完全开发default(无) : 同包访问 abstract: 指定为抽象类fi