XMLWebService完全实例详细解析
⾸先,我们必须了解什么是webservice.就概念上来说,可能⽐较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接⼝,⾥⾯有函数可供外部客户调⽤(注意:⾥⾯同样有客户不可调⽤的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调⽤规则),客户就可以在从服务端获取信息时处于⼀个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.
  webservice传递的数据只能是序列化的数据,典型的就是xml数据,这⾥我们也只讨论xml数据的传输.
  有了⼀些对xml webservice的初步了解后,我们将切⼊正题,即是⽤⼀个具体的webservice事例的形式来讲解具体的webservice⽤法,⽤具体的事例来讲解⼀个概念我想怎么也要⽐单纯的说理能让⼈容易理解吧.
  这⾥,我们将以⼀个简单的分布式课件搜索系统为例来讲解.使⽤VS2003为编译环境,C#为语⾔,SqlServcer2000为数据库.(这个例⼦来源于⼀位⽹上朋友的⽂章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来⽰例了)
  ⾸先,明确我们要做什么.我们需要⼀个对客户的接⼝,也就是个站点,我们把它称做ServiceGatherSit
e,它是何种形式都⽆所谓, 甚⾄它本⾝并不需要数据库,它只是提供给⽤户⼀个查询的接⼝,真正的服务,普通⽤户是不接触到的.然后,这⾥我们还需要若⼲个提供服务的站点,我们可以称它们为资源站,这⾥为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据⽽存在.最后,是我们最需要关注的东西---资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和 SiteBService.两个服务间没有任何关系,内部提供的⽅法也完全没关联,只是需要把⽅法如何使⽤告诉ServiceGatherSite,意思是,服务只提供查询接⼝,返回的数据如何处理,服务本⾝并不管,全由使⽤服务的站点分配.
  写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例⼦的结构,下篇⽂章,我们将开始真正进⼊代码的设计阶段.
  上篇⽂章介绍了些webservice的基本特性和我们例⼦的结构,这篇⽂章我们将开始具体的代码编写⼯作.
  这个专题主要讲述的是webservice,因此这⾥我们的代码以Webservice相关为主,⽽其他⼯程,例:ServiceGatherSite,WebSiteA等,只将简略介绍.
调用webservice服务  在VS2003中,开发⼀个webservice并不是件困难的事,⾸先,我们新建⼀个webservice项⽬(⽂件->新建->项⽬->C#->Web服务应⽤程序)
  建完这个⼯程,我们将看到⼀个叫Service1.asmx的⽂件,这就是webservice的标准⽂件,它也有UI的概念,不过我们⼀般不关注,因此,我们查看其cs代码⽂件.如果你什么都还没做的话,将看见⼀个被注释掉的helloworld的WebMethod,把注释去掉,在运⾏,你就可以得到最简单的webservice运⾏实例了.点击"helloworld"将执⾏其⽅法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.
  下⾯,我们将开始具体介绍webservice的写法.在代码⽂件⾥,如果我们写了⼀个函数后,希望此函数成为外部可调⽤的接⼝函数,我们必须
 这是获取资源站点信息的⼀个接⼝函数.⾥⾯⼤部分的代码,我想对于有⼀定asp基础的朋友来说,都应该是⼀看就明⽩,这⾥只说明下CStoreProc,这是我封装的⼀个存储过程类,主要功能是执⾏各种类型的存储过程.
 细⼼的朋友可能会发现这个函数的返回类型似乎⽐较特殊,是个xml的⽂档.我们在前⾯已经说过,webservice只能传输序列化数据, xml显然满⾜条件,但⽐如hash表之类的⾮序列化数据,是不能传输的,xml使⽤最为⼴泛,⽽且考虑到跨平台应⽤,所以这⾥我们只以xml数据的传输来⽰例.
  接上篇⽂章,我们先简单解释下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站点的信息)
  此段代码给出了xml转化成dataset的解决⽅案,虽然这不是必须的,但毕竟在asp⾥,dataset占的作⽤之重,谁都知道的.其他的请朋友们先看(呵呵,个中⾼⼿就免了),在下篇⽂章中将会有对它的⼀些解释与及多服务分布调⽤的解决⽅案,写了三篇了,发现似乎还是有些朋友看的,那我就献丑继续写下去好了,⼤家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)
  接上篇⽂章,我们先简单说明下绑定函数.⾸先实例化ServiceA,这个和⼀般类的实例化并没有不同..
接下来⽤xmlNode1来接受函数的返回值,接下来是构造xml,并将其转化为dataset,这是通⽤的⽅法,如果是刚接触不久的朋友,最好能记下这种⽅法.
  接下来给出异步调⽤两个服务的代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。