手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

XML WebService完全实例周详解析

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  接上篇文章,我们先简单解释下GetSiteAData(string AssignName)函数.

  函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返回一个空记 录.否则,我们把查询后的dataset生成一个XmlDataDocument,接下来,由于该项目的需要,我加入了一个循环,添加dataset里所 没有的节点,站点名称.在这之后,算是完成了一个符合我们期望格式的XML数据文档,我们把他返回.

  好了,webservice的方法函数介绍完了(这里更有个web服务方法,稍后介绍),接下来我们的任务是怎么调用他了.首先把webservice的 项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文档,执行GetSiteAData (string AssignName)方法,将提示您输入参数,您输入要搜索的内容,点确认,将返回给您一个XML数据,并在ie上显示出来,这就是您搜索到的内容拉.

  这里对ServiceA的工作再做点介绍,在我们这个项目里,他是资源站点A提供的服务,意思是,他查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.

  好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式我强烈建议 调试时使用,很方便.右击引用,点添加web引用,输入您的webservice地址,如:http: //localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,您必 须确保您输入的webservice存在.然后引用即可,注意:web引用名将作为您加入的webservice的名字空间.比如您输入了:SiteA, 那服务的实例化将是这样:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服务的类名).

  完成了这一步,service的调用似乎变的那么简单,我们已实现了远程实例化,接下来的远程调用也是相同的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)

以下是引用片段:
  //绑定数据
  public void BindData()
  {
  serviceA=new SiteA.Service1();
  DataSet ds=new DataSet();
  XmlNode XMLNode1;
  XmlDataDocument xd=new XMLDataDocument();
  StringBuilder XMLString1;
  XMLNode1=serviceA.GetSiteAData(strSearch);
  if(XMLNode1==null) //--存储过程执行失败
  return;
  xmlString1=new StringBuilder(xmlNode1.OuterXML);
  if(XMLString1.ToString().Equals(""))
  return ;
  xd.LoadXml(XMLString1.ToString());
  ds.ReadXml(new XMLNodeReader(xd));
  DataGrid1.DataSource=ds.Tables["list"].DefaultView;
  DataGrid1.DataBind();
  }

  此段代码给出了XML转化成dataset的解决方案,虽然这不是必须的,但毕竟在ASP.NET里,dataset占的作用之重,谁都知道的.其他的请 朋友们先看(呵呵,个中高手就免了),在下篇文章中将会有对他的一些解释和及多服务分布调用的解决方案,写了三篇了,发现似乎还是有些朋友看的,那我就献 丑继续写下去好了,大家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)

  接上篇文章,我们先简单说明下绑定函数.首先实例化ServiceA,这个和一般类的实例化并没有不同..接下来用xmlNode1来接受函数的返回值,接下来是构造XML,并将其转化为dataset,这是通用的方法,假如是刚接触不久的朋友,最好能记下这种方法.

  接下来给出异步调用两个服务的代码

以下是引用片段:
  //绑定数据
  public void BindData()
  {
  IAsyncResult ar1;
  IAsyncResult ar2;
  serviceA=new SiteA.Service1();
  serviceB=new SiteB.Service1();
  DataSet ds=new DataSet();
  XmlNode xmlNode1,XMLNode2;
  XmlDataDocument xd=new XMLDataDocument();
  StringBuilder xmlString1,XMLString2;
  //--简单的异步调用
  ar1=serviceA.BeginGetSiteAData(strSearch,null,null);
  ar2=serviceB.BeginGetSiteAData(strSearch,null,null);
  XMLNode1=serviceA.EndGetSiteAData(ar1);
  XMLNode2=serviceB.EndGetSiteAData(ar2);
  //----------
  if(xmlNode1==null&&XMLNode2==null) //--存储过程执行失败
  return;
  xmlString1=new StringBuilder(xmlNode1.OuterXML);
  xmlString2=new StringBuilder(xmlNode2.OuterXML);
  xmlString1=MakeNewXmlString(xmlString1,xmlString2); //生成新的XML
  if(XMLString1.ToString().Equals(""))
  return ;
  xd.LoadXml(XMLString1.ToString());
  ds.ReadXml(new XMLNodeReader(xd));
  DataGrid1.DataSource=ds.Tables["list"].DefaultView;
  DataGrid1.DataBind();
  }
  //生成新XML
  public StringBuilder MakeNewXMLString(StringBuilder str1,StringBuilder str2)
  {
  str1=str1.Replace("","");
  str2=str2.Replace("","");
  str1.Append(str2.ToString());
  return str1;
  }

  这有两个需要注意的地方,一个是XML构造,更有就是异步调用的实现,请读者,自己理解

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!