




免费预览已结束,剩余10页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 本文介绍了如何在非.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 string2Alice,Female); table.Rows.Add(new string2Bob,Male); table.Rows.Add(new string2Chris,Male); DataSet dataset=new DataSet(PersonTable); dataset.Tables.Add(table); return dataset; 图表1. 返回类型为DataSet的Web Method Alice Female Bob Male Chris Male 图表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 PersonAlice,Bob,Chris,Dennis; WebMethod public string GetPersonTable() DataTable table=new DataTable(Person); table.Columns.Add(Name); table.Columns.Add(Gender); table.Rows.Add(new string2Alice,Female); table.Rows.Add(new string2Bob,Male); table.Rows.Add(new string2Chris,Female); table.Rows.Add(new string2Dennis,Male); table.Rows.Add(new string2Eric,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格式的结果: Alice Female Bob Male Chris Female Dennis Male 图表5. GetPersons()的返回结果 Alice Female Bob Male Chris Female Dennis Male Eric Male 图表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. * */ 图表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:HomeUtilwasp_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 Stringname,gender,0); for(int i=0;ipersons.length;i+) model.addRow(new Stringpersonsi.Name.toString(),personsi.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:HomeUtilwasp_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 Stringname,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;ichildren.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(.*?)(.*?)在上面的WSDL中,定义了BarnesAndNoble类,指定进行检索的站点/,由于是一般的通用网站,此服务不使用SOAP,而是使用HTTP GET进行请求。 二、构建WEB服务代理 在Visual Studio.NET中,右键单击“解决方案资源管理器”中的“引用”,选择“添加WEB引用”,就可以打开“添加WEB引用”对话框,在此对话框中,输入刚才创建好的WSDL文件所在的地址,Visual Studio.NET从指定的位置获取WSDL并验证它。单击“添加引用”按钮,就可以将此WSDL描述的WEB服务的引用添加到当前的工程中。 通过以上操作,Visual Studio.NET在后台自动分析WSDL,并创建了代表Web服务的代理对象,并高速缓存了WSDL的本地副本。如果WSDL内容发生变化,需要手工“更新WEB引用”。 WEB服务代理的源代码如下: Public Class BarnesAndNobleInherits System.Web.Services.Protocols.HttpGetClientProtocolPublic Sub New()MyBase.NewMe.Url = /End Sub _Public Function GetBookDetails(ByVal isbn As String) As GetBookDetailsMatchesReturn CType(Me.Invoke(GetBookDetails, (Me.Url + ),New Object() isbn),GetBookDetailsMatches)End FunctionPublic Function BeginGetBookDetails(ByVal isbn As String, ByVal callback As System.AsyncCallback, ByVal asyncState As Object)As System.IAsyncResultReturn Me.BeginInvoke(GetBookDetails, (Me.Url + ), New Object() isbn, callback, asyncState)End FunctionPublic Function EndGetBookDetails(ByVal asyncResult As System.IAsyncResult) As GetBookDetailsMatchesReturn CType(Me.EndInvoke(asyncResult),GetBookDetailsMatches)End FunctionEnd ClassPublic Class GetBookDetailsMatches(.*?) _Public Rank As StringEnd Class如果在“解决方案资源管理器”中展开“Web References”部分,可以看出具体表达方式: 三、在WEB应用程序中编写代码,使用BarnesAndNoble Web服务。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim bn As New localhost.BarnesAndNoble()Dim match As localhost.GetBookDetailsMatchesmatch = bn.GetBookDetails()rank.Text = match.RankEnd Sub在以上程序中,首先调用New localhost.BarnesAndNoble(),创建代理的一个范例bn。bn再调用GetBookDetails()方法传入参数,最后访回一个Rank值(排名第一的影片名称)。 通过编写WSDL,访问由 WSDL 中的功能化名称调用的 Matches 对象,就可以将任何 HTML 部分作为属性来访问,我们可以轻松地将WEB站点转换为WEB服务。以上程序在Windows2000 Server、Visual Studio.NET中调试通过。 由WSDL文件生成WEB service server端C#程序一般一个已经实现功能的WEB Server会发布自己的WSDL文件,供客户端生成代理类。但有时是先有的server与client交互的接口定义(WSDL)文件,然后由server和client端分别写程序,一个提供web服务,一个使用web服务。以下介绍如何由已有的WSDL文件在VS2005中生成server端代码。1)使用VS2005提供的工具wsdl.exe由WSDL文件生成cs文件:使用wsdl.exe的/serverInterface选项(或缩写的 /si)指定输入的wsdl文件(注意,如果要转换的wsdl文件中import了其他wsdl文件,则所有文件都应列出,包括使用到的xsd文件也应列出)。输出将是 一个代码文件(默认是C#的,如果需要别的语言,参考MSDN中wsdl.exe的使用说明),其中包含每个 wsdl 绑定的接口。示例:假设ServerInterfaceSample.wsdl文件中import了importedSample.wsdl,并使用Service.xsd作为schema文件;wsdl.exe /si ServerInterfaceSample.wsdl importedSample.wsdl Service.xsd生成代码如下:/-/ / This code was generated by a tool./ Runtime Version:2.0.50727.42/ Changes to this file may cause incorrect behavior and will be lost if/ the code is regenerated./ /-using System;using System.ComponentModel;using System.Diagnostics;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Serialization;/ / This source code was auto-generated by wsdl, Version=2.0.50727.42./ / System.CodeDom.Compiler.GeneratedCodeAttribute(wsdl, 2.0.50727.42)System.Web.Services.WebServiceBindingAttribute(Name=org.csapi.cs.IpChargingManagerSOAPBinding, Namespace=/cs/wsdl)public interface IOrgcsapicsIpChargingManagerSOAPBinding / System.Web.Services.WebMethodAttribute() System.Web.Services.Protocols.SoapDocumentMethodAttribute(, RequestElementName=org.csapi.cs.IpChargingManager.createChargingSession, RequestNamespace=/cs/schema, ResponseElementName=org.csapi.cs.IpChargingManager.createChargingSessionResult, ResponseNamespace=/cs/schema, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped) return: System.Xml.Serialization.XmlElementAttribute(return, Form=System.Xml.Schema.XmlSchemaForm.Unqualified) orgcsapicsTpChargingSessionID createChargingSession(System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified) EndpointReferenceType appChargingSession, System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified) string sessionDescription, System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified) orgcsapicsTpMerchantAccountID merchantAccount, System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified) orgcsapiTpAddress user, System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified) orgcsapicsTpCorrelationID correlationID); / System.Web.Services.WebMethodAttribute() System.Web.Services.Protocols.SoapDocumentMethodAttribute(, RequestElementName=org.csapi.cs.IpChargingManager.createSplitChargingSession, RequestNamespace=/cs/schema, ResponseElementName=org.csapi.cs.IpChargingManager.createSplitChargingSessionRes
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【语文】揭阳市五年级上册期末复习试题
- 【语文】山东省青岛市嘉峪关小学小学二年级下册期末试题(含答案)
- 中国海洋知识竞赛题库(试题及答案)
- 2025年公路水运助理试验检测师道路工程考试真题及答案
- 知识产权竞赛试题库及答案
- 2025年新土建安全员c2证考试题及答案
- 2025年法院书记员面试题目及答案
- 云南bim咨询服务方案
- 新产品品牌策划咨询方案
- 美业3月活动方案策划
- 2025年全国保密教育线上培训知识考试试题库有含答案
- 2025年上海科学考试题目及答案
- 试点先行人工智能+智能客服系统可行性分析
- 兵团面试题目及答案
- 2025-2030中国基建投资拉动下工程机械需求预测与市场分析
- 胰岛素泵专家共识课件
- 电梯自行检测合规指南
- 人教版(2024)八年级上册数学全册教案
- 2025年住院医师规培-新疆-新疆住院医师规培(胸心外科)历年参考题库典型考点含答案解析
- 2025年低压电工证考试题库及答案
- 足球大单元教学计划
评论
0/150
提交评论