【转】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
[WebMethod]
public DataSet GetPersonData()
{
DataTable table=new DataTable("Person");
table.Columns.Add("Name");
table.Columns.Add("Gender");
table.Rows.Add(new string[]{"Alice","Female"});
table.Rows.Add(new string[]{"Bob","Male"});
table.Rows.Add(new string[]{"Chris","Male"});
DataSet dataset=new DataSet("PersonTable");
dataset.Tables.Add(table);
return dataset;
}
表2. 被格式化成XML的DataSet
<?xml version="1.0"encoding="utf-8"?>
<DataSetxmlns="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:choicemaxOccurs="unbounded">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"minOccurs="" />
<xs:element name="Gender" type="xs:string"minOccurs="" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgramxmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<PersonTable xmlns="">
<Person diffgr:id="Person1" msdata:rowOrder=""diffgr:hasChanges="inserted">
<Name>Alice</Name>
<Gender>Female</Gender>
</Person>
<Person diffgr:id="Person2" msdata:rowOrder=""diffgr:hasChanges="inserted">
<Name>Bob</Name>
<Gender>Male</Gender>
</Person>
<Person diffgr:id="Person3" msdata:rowOrder=""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本身的代码,即可非常快速的创建可以实用的WebServices:
表3. 用.NET实现的XML Web Services
[WebMethod]
public Person[] GetPersons()
{
Person Alice=newPerson("Alice","Female");
Person Bob=newPerson("Bob","Male");
Person Chris=newPerson("Chris","Female");
Person Dennis=newPerson("Dennis","Male");
return newPerson[]{Alice,Bob,Chris,Dennis};
}
[WebMethod]
public string GetPersonTable()
{
DataTabletable=new DataTable("Person");
table.Columns.Add("Name");
table.Columns.Add("Gender");
table.Rows.Add(new string[]{"Alice","Female"});
table.Rows.Add(new string[]{"Bob","Male"});
table.Rows.Add(new string[]{"Chris","Female"});
table.Rows.Add(new string[]{"Dennis","Male"});
table.Rows.Add(newstring[]{"Eric","Male"});
DataSetdataset=new DataSet("PersonTable");
dataset.Tables.Add(table);
System.Text.StringBuilderstrbuilder=new System.Text.StringBuilder();
StringWriter writer=new StringWriter(strbuilder);
dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
returnstrbuilder.ToString();
}
在上面的代码中,函数GetPersons()和GetPersonTable()分别对应于"1.概述"中所提到的两种解决方案。其中,Person类型就是用于封装数据集中一行数据的自定义的数据类型:
表4. 自定义类型Person
[Serializable]
public class Person
{
public Person()
{
}
public Person(stringname,string gender)
{
this.Name=name;
this.Gender=gender;
}
public string Name="";
public stringGender="";
}
【转】java 访问.net webservice返回的数据集的更多相关文章
- java使用POST发送soap报文请求webservice返回500错误解析
本文使用JAX-WS2.2编译webservice,并使用HttpUrlConnection的POST方式对wsdl发送soap报文进行请求返回数据, 对错误Server returned HTTP ...
- 如何解析android访问webservice返回的SoapObject数据(可用)
怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...
- delphi调用java编写的webservice
delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{ private stati ...
- Android 登陆功能的实现(访问WebServices 解析返回的JSON结果)
1. WebServices返回的JSON结果 { , "Result": [{ ", ", ", " }] } 2.访问WEB服务代码 i ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- mysql procedure返回多数据集
返回多数据集写法:第一种 DROP PROCEDURE IF EXISTS `p_query_user` ; DELIMITER // CREATE PROCEDURE p_query_user( p ...
- Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转
Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...
- Java动态调用webService,axis2动态调用webService
Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...
- JQuery请求WebService返回数据的几种处理方式
打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...
随机推荐
- 荣耀6 Plus 的屏幕大小pt计算方法
使用 gomobile 检测 华为荣耀 6 Plus 的屏幕大小为: 1080*1776 px ; 162pt*266.40pt ; 每pt像素个数:6.666665个. 而实际的数据是: 主 ...
- 关于BEA-000402和BEA-000438
OS:rh5 64位 JDK:1.5 64位 weblogic:9.2.3 jar 应用程序部署后,启动受管服务器报如下警告和错误: 这个问题导致系统性能下降,打开weblogic控制台各项功能和应用 ...
- SecureCRT的背景和文字颜色的修改
options->;session options->;emulation->;terminal选择linux(相应的服务器系统)ansi color 打上钩options-> ...
- SGU 176 【带上下界的有源汇的最小流】
---恢复内容开始--- 题意: 给了n个点,m条有向边. 接下来m行,每条边给起点终点与容量,以及一个标记. 标记为1则该边必须满容量,0表示可以在容量范围内任意流. 求: 从源点1号点到终点n号点 ...
- image onclick
onclick="this.src+='?rand='+Math.random();" style="cursor: pointer; vertical-align: ...
- JS 中数组的排序和去重
在 PHP 中,数组有很多排序方法,不过其他语言的数组中大概是不会像 JS 的数组一样,包罗万象,啥都通吃的.所以 JS 的数组排序情况就略多一些了. 简单粗暴的排序: 赤果果的sort: var ...
- JAVA编写WEB服务器
一.超文本传输协议 1.1 HTTP请求 1.2 HTTP应答 二.Socket类 三.ServerSocket类 四.Web服务器实例 4.1 HttpServer类 4.2 Requ ...
- 请添加 MIME 映射
HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 以管理员运行命令:C:\Wind ...
- 关于Rational Functional Tester (RFT)的简单介绍
前段时间给客户做了个RFT的简单培训,以下.因为涉及到公司的框架,所以中间省去了很多框架里的细节,只留了一个框架的总体结构的概览. RFT IBM Rational Functional Tester ...
- BZOJ1070 修车-费用网络流
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技 ...