webservice实例?XML WebService完全实例详细解析
大家好,今天我将为大家揭秘webservice实例和XML WebService完全实例详细解析的奥秘,希望我的分享能给你带来新的启发和知识。
XML WebService实例详细解析
我们必须了解什么是webservice就概念上来说可能比较复杂不过我们可以有个宏观的了解:webservice就是个对外的接口里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数)假若我们是服务端我们写好了个webservice然后把它给了客户(同时我们给了他们调用规则)客户就可以在从服务端获取信息时处于一个相对透明的状态即是客户不了解(也不需要)其过程他们只获取数据 webservice传递的数据只能是序列化的数据典型的就是xml数据这里我们也只讨论xml数据的传输
有了一些对xml webservice的初步了解后我们将切入正题即是用一个具体的webservice事例的形式来讲解具体的webservice用法用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧
这里我们将以一个简单的分布式课件搜索系统为例来讲解使用VS为编译环境 C#为语言 SqlServcer为数据库(这个例子来源于一位网上朋友的文章的启发觉得很能代表webservice的特点就按那个想法做了这么个系统来示例了)
首先明确我们要做什么我们需要一个对客户的接口也就是个站点我们把它称做ServiceGatherSite它是何种形式都无所谓甚至它本身并不需要数据库它只是提供给用户一个查询的接口真正的服务普通用户是不接触到的然后这里我们还需要若干个提供服务的站点我们可以称它们为资源站这里为简单起见假设有两个资源站分别叫WebSiteA WebSiteB它们可以是不对外公布的只是为了丰富查询数据而存在最后是我们最需要关注的东西资源站提供给ServiceGatherSite的服务两个资源站就有两个服务我们称为SiteAService和 SiteBService两个服务间没有任何关系内部提供的方法也完全没关联只是需要把方法如何使用告诉ServiceGatherSite意思是服务只提供查询接口返回的数据如何处理服务本身并不管全由使用服务的站点分配
写了这么多算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构下篇文章我们将开始真正进入代码的设计阶段
上篇文章介绍了些webservice的基本特性和我们例子的结构这篇文章我们将开始具体的代码编写工作
这个专题主要讲述的是webservice因此这里我们的代码以Webservice相关为主而其他工程例如:ServiceGatherSite WebSiteA等只将简略介绍
在VS中开发一个webservice并不是件困难的事首先我们新建一个webservice项目(文件>新建>项目>C#>Web服务应用程序)
建完这个工程我们将看到一个叫Service a*** x的文件这就是webservice的标准文件它也有UI的概念不过我们一般不关注因此我们查看其cs代码文件如果你什么都还没做的话将看见一个被注释掉的helloworld的WebMethod把注释去掉在运行你就可以得到最简单的webservice运行实例了点击 helloworld将执行其方法显然这个函数对我们的意义只在于宏观的了解了下web服务的写法
下面我们将开始具体介绍webservice的写法在代码文件里如果我们写了一个函数后希望此函数成为外部可调用的接口函数我们必须在函数上面添上一行代码[WebMethod(Description=函数的描述信息)]如果你的函数没有这个申明它将不能被用户引用如:
以下是引用片段
[WebMethod(Description=最简单的方法)]public string HelloWorld(){return Hello World;}
这个函数就是外部可调用的接口函数对用户来说相当于一个API如果某用户在引用了这个服务后他调用HelloWorld()方法他就将获得 HelloWorld这个返回值看到这里我们是不是发现其实webservice并不是那么的神秘它也不过只是个接口对我们而言侧重点依然是接口函数的编写下面我将给出我们的例子所需要的接口函数
[WebMethod(Description=查询以获取需要的课件信息)]public XmlDataDocument GetSiteAData(string AssignName){XmlDataDocument xd=new XmlDataDocument();//DataSet ds=new DataSet();CStoreProc cp=new CStoreProc( SearchAssign);cp AddParIn(@keywords SqlDbType VarChar AssignName);cp AddParOut(@res SqlDbType Int);if(cp SelectProc())//如果执行成功存储过程{cp myData EnforceConstraints=false;//不进行格式严格检查if((int)cp GetReturnValue(@res)==){string xml=;xd LoadXml(xml);return xd;}xd=new XmlDataDocument(cp myData);XmlNode root=xd DocumentElement;XmlNodeList roots=root SelectNodes( list);foreach(XmlNode roota in roots)//为所有元素加上站点名称标记{XmlElement Link=xd CreateElement( SiteName);Link InnerText=ConfigurationSettings AppSettings[ SiteName ] ToString();roota AppendChild(Link);}return xd;}else return null;}
这是获取资源站点信息的一个接口函数里面大部分的代码我想对于有一定基础的朋友来说都应该是一看就明白这里只说明下CStoreProc这是我封装的一个存储过程类主要功能是执行各种类型的存储过程细心的朋友可能会发现这个函数的返回类型似乎比较特殊是个xml的文档我们在前面已经说过 webservice只能传输序列化数据 xml显然满足条件但比如hash表之类的非序列化数据是不能传输的 xml使用最为广泛而且考虑到跨平台应用所以这里我们只以xml数据的传输来示例接上篇文章我们先简单解释下GetSiteAData(string AssignName)函数
函数功能很简单只是要返回查询结果其数据格式是XmlDataDocument当查询失败时(无匹配查询结果)我们构造一个xml返回一个空记录否则我们把查询后的dataset生成一个XmlDataDocument接下来由于该项目的需要我加入了一个循环添加dataset里所没有的节点站点名称在这之后算是完成了一个符合我们期望格式的xml数据文档我们把它返回
好了 webservice的方法函数介绍完了(这里还有个web服务方法稍后介绍)接下来我们的任务是怎么调用它了首先把webservice的项目编译完成假定我们这个服务是针对资源站点A的我们不妨称其为ServiceA先单独运行a*** x文件执行GetSiteAData(string AssignName)方法将提示你输入参数你输入要搜索的内容点确认将返回给你一个xml数据并在ie上显示出来这就是你搜索到的内容拉
这里对ServiceA的工作再做点介绍在我们这个项目里它是资源站点A提供的服务意思是它查询的数据将全来源于站点A而站点A资源添加在本项目也有专门的工程实现
好了回到正题这里我介绍vs调用webservice的方法其实其他平台的调用方法也是大同小异首先我们介绍web引用方式这种方式我强烈建议调试时使用非常方便右击引用点添加web引用输入你的webservice地址如//localhost/aspxproject/WebServiceSolution/SiteBService/service a*** x你必须保证你输入的webservice存在然后引用即可注意:web引用名将作为你加入的webservice的名字空间比如你输入了:SiteA那服务的实例化将是这样:SiteA Service serviceA=new SiteA Service();(Service是服务的类名)
完成了这一步 service的调用似乎变的那么简单我们已经实现了远程实例化接下来的远程调用也是一样的容易下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)
以下是引用片段//绑定数据public void BindData(){serviceA=new SiteA Service();DataSet ds=new DataSet();XmlNode xmlNode;XmlDataDocument xd=new XmlDataDocument();StringBuilder xmlString;xmlNode=serviceA GetSiteAData(strSearch);if(xmlNode==null)//存储过程执行失败return;xmlString=new StringBuilder(xmlNode OuterXml);if(xmlString ToString() Equals())return;xd LoadXml(xmlString ToString());ds ReadXml(new XmlNodeReader(xd));DataGrid DataSource=ds Tables[ list ] DefaultView;DataGrid DataBind();}
此段代码给出了xml转化成dataset的解决方案虽然这不是必须的但毕竟在里 dataset占的作用之重谁都知道的其他的请朋友们先看(呵呵个中高手就免了)在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案写了三篇了发现似乎还是有些朋友看的那我就献丑继续写下去好了大家有什么意见也希望提出在下的理解存在偏驳也再所难免希望谅解:)接上篇文章我们先简单说明下绑定函数首先实例化ServiceA这个和一般类的实例化并没有不同接下来用xmlNode来接受函数的返回值接下来是构造xml并将其转化为dataset这是通用的方法如果是刚接触不久的朋友最好能记下这种方法
接下来给出异步调用两个服务的代码
以下是引用片段 public void BindData(){IAsyncResult ar;IAsyncResult ar;serviceA=new SiteA Service();serviceB=new SiteB Service();DataSet ds=new DataSet();XmlNode xmlNode xmlNode;XmlDataDocument xd=new XmlDataDocument();StringBuilder xmlString xmlString;//简单的异步调用ar=serviceA BeginGetSiteAData(strSearch null null);ar=serviceB BeginGetSiteAData(strSearch null null);xmlNode=serviceA EndGetSiteAData(ar);xmlNode=serviceB EndGetSiteAData(ar);// if(xmlNode==null&&xmlNode==null)//存储过程执行失败return;xmlString=new StringBuilder(xmlNode OuterXml);xmlString=new StringBuilder(xmlNode OuterXml);xmlString=MakeNewXmlString(xmlString xmlString);//生成新的xmlif(xmlString ToString() Equals())return;xd LoadXml(xmlString ToString());ds ReadXml(new XmlNodeReader(xd));DataGrid DataSource=ds Tables[ list ] DefaultView;DataGrid DataBind();}//生成新XMLpublic StringBuilder MakeNewXmlString(StringBuilder str StringBuilder str){str=str Replace();str=str Replace();str Append(str ToString());return str;}//绑定数据这有两个需要注意的地方一个是xml构造还有就是异步调用的实现请读者自己理解
下面讲下通过dll来引用webservice的方法我只把流程介绍下
首先在ie输入服务的地址如:
然后写输入
打开后另存为xxx wsdl
然后用vs的命令提示符来编译:wsdl/namespace:SiteA ServiceA wsdl
生成名字空间为sitea的代理类
最后csc/out:ServiceA dll/t:library Service cs其中service cs为代理类文件
lishixinzhi/Article/program/net/201311/12892怎样在myecplise8开发webservice 简单实例
1.1.系统功能:
开发一个计算器服务CalculateService,这个服务包含加(plus)、减(minus)、乘(multiply)、除(divide)的操作。
1.2.开发前准备:
安装Eclipse-jee;
下载最新版本的Axis2,网址http://axis.apache.org/axis2/java/core/download.cgi
,选择Standard Binary Distribution的zip包,解压缩得到的目录名axis2-1.4.1,目录内的文件结构如下:
1.3.开发前配置:
在Eclipse的菜单栏中,Window--> Preferences--> Web Service-->
Axis2 Perferences,在Axis2 runtime
location中选择Axis2解压缩包的位置,设置好后,点"OK"即行。(如图)
1.4.开发Web Service:
(1)新建一个Java Project,命名为"WebServiceTest1"
(2)新建一个class,命名为"CalculateService",完整代码如下:
package edu.sjtu.webservice;
/**
*计算器运算
*@author rongxinhua
*/
public class CalculateService{
//加法
public float plus(float x, float y){
return x+ y;
}
//减法
public float minus(float x, float y){
return x- y;
}
//乘法
public float multiply(float x, float y){
return x* y;
}
//除法
public float divide(float x, float y){
if(y!=0)
{
return x/ y;
}
else
return-1;
}
}
(3)在"WebServiceTest1"项目上new--> other,找到"Web Services"下面的"Web Service";
(4)下一步(next),在出现的Web Services对象框,在Service
implementation中点击"Browse",进入Browse
Classes对象框,查找到我们刚才写的写的CalculateService类。(如下图)。点击"ok",则回到Web Service话框。
(5)在Web Service对话框中,将Web Service type中的滑块,调到"start service“的位置,将Client type中的滑块调到"Test client"的位置。
(6)在Web Service
type滑块图的右边有个"Configuration",点击它下面的选项,进入ServiceDeployment
Configuration对象框,在这里选择相应的Server(我这里用Tomcat6.0)和Web
Serviceruntime(选择Apache Axis2),如下图:
(7)点OK后,则返回到Web Service对话框,同理,Client
type中的滑块右边也有"Configuration",也要进行相应的置,步骤同上。完成后,Next-->
next即行。进入到Axis2 Web Service Java Bean Configuration,我们选择Generate a
default services.xml,如下图所示:
(8)到了Server startup对话框,有个按键"start server"(如下图),点击它,则可启动Tomcat服务器了。
(9)等启完后,点击"next--> next",一切默认即行,最后,点击完成。最后,出现如下界面:(Web Service
Explorer),我们在这里便可测试我们的Web服务。(使用浏览器打开的话使用如下地址:http://127.0.0.1:19189/wse
/wsexplorer/wsexplorer.jsp?org.eclipse.wst.ws.explorer=3)。如下图所示:
注:在浏览器中打开Web Service Explorer(有时候在eclipse中关闭了webservice explorer,可以用这种方法打开)
首先登录地址:http://127.0.0.1:19189/wse/wsexplorer/wsexplorer.jsp。然后在网页右上角选择
Web Service
Exoplorer标签。然后输入WSDL地址:http://localhost:8080/WebServiceTest1/services
/CalculateService?wsdl。这个wsdl地址就是我们刚才发布服务的那个wsdl。点击go,如下图所示:
然后就可以看到如下界面了:
(10)测试比较简单,例如,我们选择一个"plus"的Operation(必须是
CalculateServiceSoap11Binding),出现下图,在x的输入框中输入1,在y的输入框中输入2,点击"go",便会在
status栏中显示结果3.0。其他方法的测试也类似。结果如上图所示。
1.5.CalculateService客户端调用程序
前面我们已经定义好了加减乘除的方法并将这些方法发布为服务,那么现在要做的就是调用这些服务即可。客户端调用程序如下代码所示:CalculateServiceTest.java
package edu.sjtu.webservice.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class CalculateServiceTest{
/**
*@param args
*@throws AxisFault
*/
public static void main(String[] args) throws AxisFault{
// TODO Auto-generated method stub
//使用RPC方式调用WebService
RPCServiceClient serviceClient= new RPCServiceClient();
Options options= serviceClient.getOptions();
//指定调用WebService的URL
EndpointReference targetEPR= new EndpointReference(
"http://localhost:8080/WebServiceTest1/services/CalculateService");
options.setTo(targetEPR);
//指定要调用的计算机器中的方法及WSDL文件的命名空间:edu.sjtu.webservice。
QName opAddEntry= new QName("http://webservice.sjtu.edu","plus");//加法
QName opAddEntryminus= new QName("http://webservice.sjtu.edu","minus");//减法
QName opAddEntrymultiply= new QName("http://webservice.sjtu.edu","multiply");//乘法
QName opAddEntrydivide= new QName("http://webservice.sjtu.edu","divide");//除法
//指定plus方法的参数值为两个,分别是加数和被加数
Object[] opAddEntryArgs= new Object[]{ 1,2};
//指定plus方法返回值的数据类型的Class对象
Class[] classes= new Class[]{ float.class};
//调用plus方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntryminus,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrymultiply,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrydivide,opAddEntryArgs, classes)[0]);
}
}
运行结果:
3.0
-1.0
2.0
0.5
2.实例
2.HelloService
(1)首先定义服务方法,代码如下所示:
package edu.sjtu.webservice;
public class HelloService{
public String sayHelloNew(){
return"hello";
}
public String sayHelloToPersonNew(String name){
if(name== null){
name="nobody";
}
return"hello,"+ name;
}
public void updateData(String data){
System.out.println(data+"已更新。");
}
}
(2)参考实例1将这个方法发布为服务。
(3)编写客户端代码调用WebService(主要参考[5])
本文例子与其他例子最大的不同就在这里,其他例子一般需要根据刚才的服务wsdl生成客户端stub,然后通过stub来调用服务,这种方式显得比
较单一,客户端必须需要stub存根才能够访问服务,很不方面。本例子的客户端不采用stub方式,而是一种实现通用的调用方式,不需要任何客户端存根即
可访问服务。只需要指定对于的web servce地址、操作名、参数和函数返回类型即可。代码如下所示:
HelloServiceTest2.java
package edu.sjtu.webservice.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class HelloServiceTest2{
private RPCServiceClient serviceClient;
private Options options;
private EndpointReference targetEPR;
public HelloServiceTest2(String endpoint) throws AxisFault{
serviceClient= new RPCServiceClient();
options= serviceClient.getOptions();
targetEPR= new EndpointReference(endpoint);
options.setTo(targetEPR);
}
public Object[] invokeOp(String targetNamespace, String opName,
Object[] opArgs, Class<?>[] opReturnType) throws AxisFault,
ClassNotFoundException{
//设定操作的名称
QName opQName= new QName(targetNamespace, opName);
//设定返回值
// Class<?>[] opReturn= new Class[]{ opReturnType};
//操作需要传入的参数已经在参数中给定,这里直接传入方法中调用
return serviceClient.invokeBlocking(opQName, opArgs, opReturnType);
}
/**
*@param args
*@throws AxisFault
*@throws ClassNotFoundException
*/
public static void main(String[] args) throws AxisFault,
ClassNotFoundException{
// TODO Auto-generated method stub
final String endPointReference="http://localhost:8080/WebServiceTest1/services/HelloService";
final String targetNamespace="http://webservice.sjtu.edu";
HelloServiceTest2 client= new HelloServiceTest2(endPointReference);
String opName="sayHelloToPersonNew";
Object[] opArgs= new Object[]{"My Friends"};
Class<?>[] opReturnType= new Class[]{ String[].class};
Object[] response= client.invokeOp(targetNamespace, opName, opArgs,
opReturnType);
System.out.println(((String[]) response[0])[0]);
}
}
运行该程序,点击Run As->Java application,可以看到控制台端口的输出是:Hello, My
Friends,表明客户端调用成功。该例子最大的不同和优势表现在客户端的调用方式,或者说是发起服务调用的方式,虽然比起客户端stub存根的方式,
代码稍多,但是这种方式统一,不需要生产stub存根代码,解决了客户端有很多类的问题。如果读者对这些代码进一步封装,我想调用方式很简单,只需要传递
相关参数,这更好地说明了服务调用的优势。而且这种方式更加简单明了,一看便知具体含义。而不需要弄得stub类的一些机制。
(4)改写客户端调用服务的代码
(3)中提到的客户端应用代码写的略微有些繁杂,下面将上面的客户端调用service程序进行改写,简洁了许多。代码如下:
HelloServiceTest.java
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class HelloServiceTest{
public static void main(String args[]) throws AxisFault{
//使用RPC方式调用WebService
RPCServiceClient serviceClient= new RPCServiceClient();
Options options= serviceClient.getOptions();
//指定调用WebService的URL
EndpointReference targetEPR= new EndpointReference("http://localhost:8080/WebServiceTest1/services/HelloService");
options.setTo(targetEPR);
//指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
QName opAddEntry= new QName("http://webservice.sjtu.edu","sayHelloToPersonNew");
//指定sayHelloToPerson方法的参数值
Object[] opAddEntryArgs= new Object[]{"xuwei"};
//指定sayHelloToPerson方法返回值的数据类型的Class对象
Class[] classes= new Class[]{ String.class};
//调用sayHelloToPerson方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
}
}
XML WebService完全实例详细解析
首先我们必须了解什么是webservice就概念上来说可能比较复杂不过我们可以有个宏观的了解 webservice就是个对外的接口里面有函数可供外部客户调用(注意里面同样有客户不可调用的函数)假若我们是服务端我们写好了个webservice然后把它给了客户(同时我们给了他们调用规则)客户就可以在从服务端获取信息时处于一个相对透明的状态即是客户不了解(也不需要)其过程他们只获取数据
webservice传递的数据只能是序列化的数据典型的就是xml数据这里我们也只讨论xml数据的传输
有了一些对xml webservice的初步了解后我们将切入正题即是用一个具体的webservice事例的形式来讲解具体的webservice用法用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧
这里我们将以一个简单的分布式课件搜索系统为例来讲解使用VS为编译环境 C#为语言 SqlServcer为数据库(这个例子来源于一位网上朋友的文章的启发觉得很能代表webservice的特点就按那个想法做了这么个系统来示例了)
首先明确我们要做什么我们需要一个对客户的接口也就是个站点我们把它称做ServiceGatherSite它是何种形式都无所谓甚至它本身并不需要数据库它只是提供给用户一个查询的接口真正的服务普通用户是不接触到的然后这里我们还需要若干个提供服务的站点我们可以称它们为资源站这里为简单起见假设有两个资源站分别叫WebSiteA WebSiteB它们可以是不对外公布的只是为了丰富查询数据而存在最后是我们最需要关注的东西——资源站提供给ServiceGatherSite的服务两个资源站就有两个服务我们称为SiteAService和 SiteBService两个服务间没有任何关系内部提供的方法也完全没关联只是需要把方法如何使用告诉ServiceGatherSite意思是服务只提供查询接口返回的数据如何处理服务本身并不管全由使用服务的站点分配
写了这么多算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构下篇文章我们将开始真正进入代码的设计阶段
上篇文章介绍了些webservice的基本特性和我们例子的结构这篇文章我们将开始具体的代码编写工作
这个专题主要讲述的是webservice因此这里我们的代码以Webservice相关为主而其他工程例如 ServiceGatherSite WebSiteA等只将简略介绍
在VS中开发一个webservice并不是件困难的事首先我们新建一个webservice项目(文件>新建>项目>C#>Web服务应用程序)
建完这个工程我们将看到一个叫Service a*** x的文件这就是webservice的标准文件它也有UI的概念不过我们一般不关注因此我们查看其cs代码文件如果你什么都还没做的话将看见一个被注释掉的helloworld的WebMethod把注释去掉在运行你就可以得到最简单的webservice运行实例了点击 helloworld将执行其方法显然这个函数对我们的意义只在于宏观的了解了下web服务的写法
下面我们将开始具体介绍webservice的写法在代码文件里如果我们写了一个函数后希望此函数成为外部可调用的接口函数我们必须在函数上面添上一行代码[WebMethod(Description=函数的描述信息)]如果你的函数没有这个申明它将不能被用户引用如
[WebMethod(Description=最简单的方法)] public string HelloWorld(){ return Hello World;}
这个函数就是外部可调用的接口函数对用户来说相当于一个API如果某用户在引用了这个服务后他调用HelloWorld()方法他就将获得 HelloWorld这个返回值
看到这里我们是不是发现其实webservice并不是那么的神秘它也不过只是个接口对我们而言侧重点依然是接口函数的编写下面我将给出我们的例子所需要的接口函数
[WebMethod(Description=查询以获取需要的课件信息)] public XmlDataDocument GetSiteAData(string AssignName){ XmlDataDocument xd=new XmlDataDocument();// DataSet ds=new DataSet(); CStoreProc cp=new CStoreProc( SearchAssign); cp AddParIn(@keywords SqlDbType VarChar AssignName); cp AddParOut(@res SqlDbType Int); if(cp SelectProc())//如果执行成功存储过程{ cp myData EnforceConstraints=false;//不进行格式严格检查 if((int)cp GetReturnValue(@res)==){ string xml=; xd LoadXml(xml); return xd;} xd=new XmlDataDocument(cp myData); XmlNode root=xd DocumentElement; XmlNodeList roots=root SelectNodes( list); foreach(XmlNode roota in roots)//为所有元素加上站点名称标记{ XmlElement Link=xd CreateElement( SiteName); Link InnerText=ConfigurationSettings AppSettings[ SiteName ] ToString(); roota AppendChild(Link);} return xd;} else return null;}
这是获取资源站点信息的一个接口函数里面大部分的代码我想对于有一定基础的朋友来说都应该是一看就明白这里只说明下CStoreProc这是我封装的一个存储过程类主要功能是执行各种类型的存储过程
细心的朋友可能会发现这个函数的返回类型似乎比较特殊是个xml的文档我们在前面已经说过 webservice只能传输序列化数据 xml显然满足条件但比如hash表之类的非序列化数据是不能传输的 xml使用最为广泛而且考虑到跨平台应用所以这里我们只以xml数据的传输来示例
[NextPage]
接上篇文章我们先简单解释下GetSiteAData(string AssignName)函数
函数功能很简单只是要返回查询结果其数据格式是XmlDataDocument当查询失败时(无匹配查询结果)我们构造一个xml返回一个空记录否则我们把查询后的dataset生成一个XmlDataDocument接下来由于该项目的需要我加入了一个循环添加dataset里所没有的节点站点名称在这之后算是完成了一个符合我们期望格式的xml数据文档我们把它返回
好了 webservice的方法函数介绍完了(这里还有个web服务方法稍后介绍)接下来我们的任务是怎么调用它了首先把webservice的项目编译完成假定我们这个服务是针对资源站点A的我们不妨称其为ServiceA先单独运行a*** x文件执行GetSiteAData(string AssignName)方法将提示你输入参数你输入要搜索的内容点确认将返回给你一个xml数据并在ie上显示出来这就是你搜索到的内容拉
这里对ServiceA的工作再做点介绍在我们这个项目里它是资源站点A提供的服务意思是它查询的数据将全来源于站点A而站点A资源添加在本项目也有专门的工程实现
好了回到正题这里我介绍vs调用webservice的方法其实其他平台的调用方法也是大同小异首先我们介绍web引用方式这种方式我强烈建议调试时使用非常方便右击引用点添加web引用输入你的webservice地址如//localhost/aspxproject/WebServiceSolution/SiteBService/service a*** x你必须保证你输入的webservice存在然后引用即可注意 web引用名将作为你加入的webservice的名字空间比如你输入了 SiteA那服务的实例化将是这样 SiteA Service serviceA=new SiteA Service()(Service是服务的类名)
完成了这一步 service的调用似乎变的那么简单我们已经实现了远程实例化接下来的远程调用也是一样的容易下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)
//绑定数据 public void BindData(){ serviceA=new SiteA Service(); DataSet ds=new DataSet(); XmlNode xmlNode; XmlDataDocument xd=new XmlDataDocument(); StringBuilder xmlString; xmlNode=serviceA GetSiteAData(strSearch); if(xmlNode==null)//存储过程执行失败 return; xmlString=new StringBuilder(xmlNode OuterXml); if(xmlString ToString() Equals()) return; xd LoadXml(xmlString ToString()); ds ReadXml(new XmlNodeReader(xd)); DataGrid DataSource=ds Tables[ list ] DefaultView; DataGrid DataBind();}
此段代码给出了xml转化成dataset的解决方案虽然这不是必须的但毕竟在里 dataset占的作用之重谁都知道的其他的请朋友们先看(呵呵个中高手就免了)在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案写了三篇了发现似乎还是有些朋友看的那我就献丑继续写下去好了大家有什么意见也希望提出在下的理解存在偏驳也再所难免希望谅解)
接上篇文章我们先简单说明下绑定函数首先实例化ServiceA这个和一般类的实例化并没有不同……接下来用xmlNode来接受函数的返回值接下来是构造xml并将其转化为dataset这是通用的方法如果是刚接触不久的朋友最好能记下这种方法
接下来给出异步调用两个服务的代码
//绑定数据 public void BindData(){ IAsyncResult ar; IAsyncResult ar; serviceA=new SiteA Service(); serviceB=new SiteB Service(); DataSet ds=new DataSet(); XmlNode xmlNode xmlNode; XmlDataDocument xd=new XmlDataDocument(); StringBuilder xmlString xmlString;//简单的异步调用 ar=serviceA BeginGetSiteAData(strSearch null null); ar=serviceB BeginGetSiteAData(strSearch null null); xmlNode=serviceA EndGetSiteAData(ar); xmlNode=serviceB EndGetSiteAData(ar);// if(xmlNode==null&&xmlNode==null)//存储过程执行失败 return; xmlString=new StringBuilder(xmlNode OuterXml); xmlString=new StringBuilder(xmlNode OuterXml); xmlString=MakeNewXmlString(xmlString xmlString);//生成新的xml if(xmlString ToString() Equals()) return; xd LoadXml(xmlString ToString()); ds ReadXml(new XmlNodeReader(xd)); DataGrid DataSource=ds Tables[ list ] DefaultView; DataGrid DataBind();}//生成新XML public StringBuilder MakeNewXmlString(StringBuilder str StringBuilder str){ str=str Replace(); str=str Replace(); str Append(str ToString()); return str;}
这有两个需要注意的地方一个是xml构造还有就是异步调用的实现请读者自己理解
下面讲下通过dll来引用webservice的方法我只把流程介绍下
首先在ie输入服务的地址如
然后写输入?wsdl
打开后另存为xxx wsdl
然后用vs的命令提示符来编译 wsdl/namespace SiteA ServiceA wsdl
生成名字空间为sitea的代理类
最后csc/out ServiceA dll/t library Service cs其中service cs为代理类文件
lishixinzhi/Article/program/net/201311/13199关于webservice实例的内容到此结束,希望对大家有所帮助。