国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

非.NET語言調用.NET XML Web Services返回的數據集合的2個辦法

非.NET語言調用.NET XML Web Services返回的數據集合的2個辦法

更新時間:2022-05-02 文章作者:未知 信息來源:網絡 閱讀次數:

摘要
本文介紹了如何在非.NET語言環境中(如Java、Delphi等)調用.NET XML Web Services,并特別針對很多開發者所關心的"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的問題,提出了兩個解決方案:使用自定義類型數組和使用DataSet.WriteXML()。

-------------------------------------------------------------------


目錄
1. 概述
2. 創建.NET Web Services,返回數據集合
3. 在Java中調用.NET Web Services,處理返回的數據集合
4. 小結

-------------------------------------------------------------------

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格式數據:
[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;
}

圖表1. 返回類型為DataSet的Web Method
<?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>

圖表2. 被格式化成XML的DataSet
從上面的例子可以看出,直接使用DataSet作為返回類型,其結果是相當復雜的,其中不但包含了DataSet中的數據,還包括了數據更改的信息,以及DataSet的Schema。雖然有些工具能夠生成一個類似DataSet的客戶端類型,但無論是直接解析復雜的XML還是使用類似DataSet的類,都不夠直接不夠清晰。
解決這個問題的方案有兩種:
1) 用簡單數據類型構造自定義類型,用每一個自定義類型對象封裝數據集中的一行,將自定義類型對象的數組(Array)返回客戶端;由于是用簡單數據類型定義,客戶端能夠完全不變的還原出自定義類型的定義;
2) 用DataSet.WriteXML()方法將數據集中的數據提取成XML格式,并以字符串的形式返回給客戶端,再由客戶端解析XML字符串,還原出數據。由于使用WriteXML()的時候能夠過濾掉冗余信息,返回的內容和圖表2中的內容相比大大簡化了。
下面就將用C#分別實現這兩種方案,并詳細演示如何在Java客戶端中調用并獲取數據。

-------------------------------------------------------------------

2. 創建.NET Web Services,返回數據集合
借助于Visual Studio.NET,只需編寫Web Method本身的代碼,即可非常快速的創建可以實用的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();
}

圖表3. 用.NET實現的XML Web Services
在上面的代碼中,函數GetPersons()和GetPersonTable()分別對應于"1. 概述"中所提到的兩種解決方案。其中,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="";
}

圖表4. 自定義類型Person
下面就是在Internet Exploerer里直接調用這兩個Web Method所得到的XML格式的結果:
<?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>

圖表5. GetPersons()的返回結果
<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>

圖表6. GetPersonTable()的返回的String類型的值
到這里,XML Web Service的創建就已經完成了。.NET中創建的XML Web Services遵循的是統一的行業標準(SOAP、XML等),因此無論使用.NET語言還是使用非.NET語言,都可以調用它。尤其對于GetPersonTable()返回的結果來說,只要用XML Parser作簡單的處理,就能把數據提取出來。下面就將演示如何在Java中完成這一處理。

-------------------------------------------------------------------

3. 在Java中調用.NET Web Services,處理返回的數據集合
編寫客戶端調用Web Services時,最快速簡便做法的是利用工具根據Web Services的WSDL描述生成客戶端代理類(Proxy),而不是直接對SOAP Toolkit進行編程。在.NET Framework中,這個工作可以由wsdl.exe完成。在Java中,可以在JBuilder或者VisualAge Java等Java IDE中安裝一個叫做WASP Developer的免費插件,這個插件也能完成由WSDL描述生成Proxy類的工作。另外,該公司還提供了WASP Server for Java和WASP UDDI,降低了用戶用Java開發Web Services以及建立UDDI服務的難度。
在本文的例子中,用了JBuilder 7+WASP Developer來調用前文中建立的.NET XML Web Services。在調用之前,首先是用WASP Developer生成Proxy類。從圖表7、8中可以看到,生成Proxy的工具已經在Java中也創建了一個Person類:


圖表7. 用WASP Developer生成的Proxy類
package javaclient.service1Soap12Clientstruct;

public class Person {
public java.lang.String Name;
public java.lang.String Gender;
}

/*
* Generated by WSDLCompiler, (c) 2002, Systinet Corp.
* http://www.systinet.com
*/

圖表8. WASP Developer創建的Person類
在Proxy類的基礎上,就可以訪問.NET編寫的Web Services并提取數據了。對于GetPersons()來說,由于已經生成了Person類,所以調用代碼非常簡單直接:
import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;
import javax.swing.*;
import javax.swing.table.*;

try{
System.setProperty( "wasp.location","C:\\Home\\Util\\wasp_4.0SP2");

javaclient.service1Soap12Client.Service1Soap service;
String serviceURI = "http://localhost/dotNetHost/Service1.asmx";
String wsdlURI = "http://localhost/dotNetHost/Service1.asmx?wsdl";

WebServiceLookup lookup = (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
service = (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
wsdlURI,
javaclient.service1Soap12Client.Service1Soap.class,
serviceURI);

Person[] persons=
service.GetPersons(new javaclient.service1Soap12Clientstruct.GetPersons()).GetPersonsResult;
DefaultTableModel model=new DefaultTableModel(new String[]{"name","gender"},0);
for(int i=0;i<persons.length;i++){
model.addRow(new String[]{persons[i].Name.toString(),persons[i].Gender.toString()});
}
this.jTable1.setModel(model);
}
catch(Exception ex)
{
javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage());
}

圖表9. 在Java中調用GetPersons()的代碼
調用GetPersonTable()并解析XML字符串要相對復雜一些,需要用到XML Parser從圖表6中的XML字符串中提取數據,并逐一顯示在JTable中。下面是從訪問Web Method到解析XML,最后提取數據并顯示的完整代碼,及其運行結果截圖:
import javax.swing.*;
import javax.swing.table.*;

import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;

import org.w3c.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xerces.dom.*;

try{
System.setProperty( "wasp.location","C:\\Home\\Util\\wasp_4.0SP2");

javaclient.service1Soap12Client.Service1Soap service;
String serviceURI = "http://localhost/dotNetHost/Service1.asmx";
String wsdlURI = "http://localhost/dotNetHost/Service1.asmx?wsdl";

WebServiceLookup lookup = (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
service = (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
wsdlURI,
javaclient.service1Soap12Client.Service1Soap.class,
serviceURI);

String result=
service.GetPersonTable(new javaclient.service1Soap12Clientstruct.GetPersonTable()).GetPersonTableResult;
DefaultTableModel model=new DefaultTableModel(new String[]{"name","gender"},0);

java.io.StringReader reader=new java.io.StringReader(result);
org.apache.xerces.parsers.DOMParser parser=new org.apache.xerces.parsers.DOMParser();
parser.parse(new org.xml.sax.InputSource(reader));
org.w3c.dom.Document document=parser.getDocument();
org.w3c.dom.NodeList children=document.getDocumentElement().getChildNodes();

for(int i=0;i<children.getLength();i++){
org.w3c.dom.Node node=children.item(i);
if(node.getNodeName().equals("Person")){
org.w3c.dom.NodeList personAttrNodes=node.getChildNodes();
String name="N/A";
String gender="N/A";

for(int j=0;j<personAttrNodes.getLength();j++){
org.w3c.dom.Node attrNode=personAttrNodes.item(j);
String attrNodeName=attrNode.getNodeName();
if(attrNodeName.equals("Name")){
name=attrNode.getFirstChild().getNodeValue();
}else if(attrNodeName.equals("Gender")){
gender=attrNode.getFirstChild().getNodeValue();
}else{
continue;
}
}
model.addRow(new String[]{name,gender});
}
}
this.jTable1.setModel(model);
}
catch(Exception ex)
{
javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage());
}

圖表10. 在Java中調用GetPersonTable()的代碼


圖表11.調用GetPersonTable()的運行結果

-------------------------------------------------------------------

4. 小結
從前面的敘述和代碼中可以看出,對于"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的問題,雖然在非.NET語言環境中直接接受DataSet類型的返回值比較困難,但可以有其他的解決方案。
對于第一種解決方案,也就是采用自定義數據類型,它的優點是客戶端代碼非常簡單,容易編寫,而且容易理解。它的缺點是服務器端需要定義新的類,而且當通過ADO.NET從數據庫中提取數據以后,還要再手工編寫代碼,將DataSet中的數據遍歷一遍,轉存成自定義類型的對象。
對于第二種解決方案,就是用DataSet.WriteXML()的方案,它的優點和缺點正好和第一種方案是互補的。它在客戶端需要編寫較多的代碼,尤其是需要用XML Parser編程,提高了編程的難度。另一方面,它在服務器端比較簡單。如果開發者在原先的純.NET環境(即客戶端也是.NET)中已經開發了返回類型為DataSet的Web Services,那么當開發者希望在客戶端引入非.NET語言時,服務器端只需要簡單的再增加一個Web Method,通過簡單的WriteXML()調用對原有的方法進行簡單的包裝,就能夠適用于非.NET客戶端了。
從更廣闊的角度來看,上面兩種解決方案也可以用在"非.NET服務器+.NET客戶端"的Web Services環境中。在各種非原生(Native)的情況下,盡量使用簡單數據類型,或者使用XML來表達數據,總是上佳的選擇。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        午夜电影一区二区三区| 国产精品视频九色porn| 精品国产一区a| 精东粉嫩av免费一区二区三区| 欧美一区二区三区四区久久 | 99精品久久免费看蜜臀剧情介绍| 中日韩av电影| 欧美色图在线观看| 麻豆国产91在线播放| 国产亚洲女人久久久久毛片| 99国产精品久久久| 爽爽淫人综合网网站| 亚洲精品在线网站| 波多野结衣亚洲| 日韩综合在线视频| 国产女人水真多18毛片18精品视频| 不卡免费追剧大全电视剧网站| 亚洲一区在线电影| 久久精品人人爽人人爽| 欧美三电影在线| 国产高清在线观看免费不卡| 亚洲一区二区三区四区在线 | 一区二区中文视频| 欧美一级日韩不卡播放免费| 成人免费高清视频| 看片网站欧美日韩| 一区二区三区**美女毛片| 欧美精品一区视频| 欧美精品在欧美一区二区少妇| 懂色中文一区二区在线播放| 午夜精品久久久久久久久久| 国产精品乱人伦一区二区| 日韩一区二区三区电影| 91麻豆国产香蕉久久精品| 精品在线免费视频| 午夜久久久久久久久久一区二区| 国产色产综合色产在线视频 | 一本大道久久a久久精二百| 麻豆成人久久精品二区三区小说| 一区二区三区电影在线播| 国产校园另类小说区| 日韩你懂的在线播放| 欧美日韩一区三区四区| 91浏览器打开| 99国内精品久久| 高清国产一区二区| 激情综合色综合久久| 秋霞电影网一区二区| 午夜精品一区在线观看| 午夜视频在线观看一区二区| 亚洲国产中文字幕在线视频综合| 亚洲乱码国产乱码精品精98午夜| 国产精品女主播在线观看| 国产视频911| 欧美国产日韩a欧美在线观看 | 欧美一区二区网站| 制服丝袜一区二区三区| 555www色欧美视频| 欧美mv日韩mv亚洲| 91精品国模一区二区三区| 欧美精品 国产精品| 欧美一区二区三区啪啪| 欧美成人官网二区| 国产视频一区二区三区在线观看| 国产亚洲va综合人人澡精品| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品久久久久久久久果冻传媒 | 亚洲综合色网站| 亚洲一区二区三区精品在线| 亚洲成精国产精品女| 午夜私人影院久久久久| 蜜臀91精品一区二区三区| 久久99日本精品| 高清免费成人av| 在线日韩国产精品| 欧美一区二区三区在线看| 久久久久久久久久久久久夜| 中文字幕制服丝袜成人av | 日韩美女啊v在线免费观看| 亚洲精选视频免费看| 婷婷成人激情在线网| 美洲天堂一区二卡三卡四卡视频| 国产一区在线观看视频| bt欧美亚洲午夜电影天堂| 欧美日韩精品一区二区| 久久美女艺术照精彩视频福利播放 | 日韩美女视频一区二区| 亚洲国产一二三| 国产精品1024| 欧美日韩色综合| 精品99一区二区三区| 亚洲美女一区二区三区| 蜜桃一区二区三区四区| 91色在线porny| 精品国产乱码久久久久久1区2区| 一区精品在线播放| 久久97超碰国产精品超碰| 色94色欧美sute亚洲线路一ni| 欧美不卡一区二区三区四区| 亚洲免费观看高清在线观看| 韩国三级电影一区二区| 欧美三级午夜理伦三级中视频| 久久婷婷综合激情| 亚洲国产精品影院| 99r国产精品| 精品成人免费观看| 日韩在线一区二区| 色欧美88888久久久久久影院| 久久久天堂av| 美女视频网站久久| 欧美日韩一区久久| 国产精品私人自拍| 国产精品亚洲一区二区三区妖精| 欧美婷婷六月丁香综合色| 国产精品狼人久久影院观看方式| 久久精工是国产品牌吗| 欧美日韩成人激情| 亚洲国产一二三| 色国产综合视频| 亚洲日本中文字幕区| 成人丝袜18视频在线观看| 久久亚洲二区三区| 麻豆成人在线观看| 欧美成人欧美edvon| 日精品一区二区| 7777精品伊人久久久大香线蕉最新版| 亚洲综合免费观看高清在线观看| 99久久99久久久精品齐齐| 国产精品麻豆视频| proumb性欧美在线观看| 国产精品三级av| 99精品一区二区三区| 中文字幕色av一区二区三区| 成人av网站免费| 一区视频在线播放| 91福利在线导航| 天天色 色综合| 日韩欧美在线网站| 国产一区二区三区免费观看| 国产网红主播福利一区二区| 国产一区 二区 三区一级| 国产日韩av一区| 91丨九色丨国产丨porny| 亚洲女同ⅹxx女同tv| 欧美三级视频在线观看| 日本伊人色综合网| 国产香蕉久久精品综合网| 国产成人亚洲综合a∨猫咪| 国产精品视频一区二区三区不卡| av动漫一区二区| 亚洲国产成人tv| 日韩精品一区二区在线观看| 国产99久久精品| 一区二区三区成人| 欧美大片在线观看| 91在线云播放| 蜜桃一区二区三区在线| 国产日韩综合av| 欧美日韩精品免费| 国产一区二区91| 亚洲五月六月丁香激情| 久久人人超碰精品| 色综合久久久久| 精品无人码麻豆乱码1区2区| 亚洲三级在线看| 精品国产露脸精彩对白| 色综合色狠狠天天综合色| 日日夜夜免费精品视频| 日本一区二区三区国色天香| 欧美日韩免费在线视频| 福利一区二区在线| 日本亚洲天堂网| 亚洲精品高清在线观看| 久久九九全国免费| 欧美卡1卡2卡| 91女人视频在线观看| 久久66热偷产精品| 亚洲国产一二三| 综合激情成人伊人| 久久婷婷色综合| 91精品在线免费| 91丨porny丨最新| 国产成人在线影院 | 免费看欧美美女黄的网站| 17c精品麻豆一区二区免费| 日韩免费电影网站| 欧美色男人天堂| jlzzjlzz欧美大全| 激情综合网最新| 麻豆免费精品视频| 日韩黄色一级片| 亚洲一区二区欧美日韩| 国产精品福利电影一区二区三区四区| 日韩欧美久久一区| 91精品中文字幕一区二区三区| 精品污污网站免费看| 欧美午夜免费电影| 欧美午夜精品久久久久久孕妇| 在线视频亚洲一区| 欧美午夜精品一区二区三区|