Xml WebService完全实例解析

上一篇 / 下一篇  2010-05-05 13:38:29 / 天气: 晴朗 / 心情: 高兴

      最先,我们必需懂得什么是webservice.就观念上来说,也许比拟庞杂,不过我们能够有个宏观的了解:webservice即使个对外的接口,里边有函数可供外表客户调用(留神:里边同样有客户不可调用的函数).假使我们是效力端,我们写好了个webservice,然后把它给了客户(一同我们给了他们调用规矩),客户就能够在从效劳端获得消息时处于一个相对透亮的状况.即是客户不懂得(也不须要)其进程,他们只获得数据.      webservice递送的数据只能是序列化的数据,典范的就是xml数据,此处我们也只议论xml数据的传输.
      有了一些对xml webservice的开始懂得后,我们将切进正题,即是用一个详尽的webservice事例的情势来讲授详细的webservice用法,用详细的事例来讲授一个观念我想怎么也要比纯粹的说理能让人轻易懂得吧.
      此地,我们将以一个简略的散布式课件搜查体系为例来讲授.应用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子起源于一位网上友人的文章的启示,感到很能代表webservice的特色,就按那个设法做了这样个体系来举例了)
      首先,明白我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种情势都无所谓,甚至它本身并不必要数据库,它只是提供应用户一个查询的接口,真实的服务,一般用户是不往来到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源站,这里为简单起见,假设有两个资源站,分辨叫WebSiteA,WebSiteB,它们可以是不对外颁布的,只是为了丰盛查询数据而存留.末尾,是我们最需要关怀的东西---资源站提供应ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和SiteBService.两个服务间没有任何牵涉,内部供给的方法也完整没关系,只是需要把方法如何使用告知ServiceGatherSite,含义是,服务只供给查询接口,归来的数据如何处置,服务本身并不管,全由使用服务的站点分摊.
       写了这样多,算是扼要的先容了下有关xml webservice的观念和我们这个例子的构造,我们将开端真实进去代码的设计阶段.
       这个专题重要解说的是webservice,因而此地我们的代码以Webservice相干为主,而其余工程,譬如:ServiceGatherSite,WebSiteA等,只将简单先容.
      在VS2003中,开拓一个webservice并不是件艰苦的事,最先,我们修建一个webservice项目(文件->兴修->项目->C#->Web效力利用过程)
      建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的尺度文件,它也有UI的概念,不过我们平常不关怀,因而,我们察看其cs代码文件.如果你什么都还没做的话,将目睹一个被注释掉的helloworld的WebMethod,把注释往掉,在运行,你就可以取得最简单的webservice运行实例了.点击"helloworld"将执行其方法.明显,这个函数对我们的含义只在于宏观的了解了下web服务的写法.
      下面,我们将开端详细介绍webservice的写法.在代码文件里,如果我们写了一个函数后,盼望此函数成为外表可调用的接口函数,我们必需在函数上面添上一行代码[WebMethod(Description="函数的描写信息")],如果你的函数不曾这个声名,它将不能被用户引用.如:
[WebMethod(Description="最简单的方法")]
  public string HelloWorld()
  {
   return "Hello World";
  }
     ,ruqing0360; 这个函数即使外表可调用的接口函数,对用户来说相当于一个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,30,AssignName);
   cp.AddParOut("@res",SqlDbType.Int);
   if(cp.SelectProc()) //假如履行胜利,存储进程
   {
    cp.myData.EnforceC; //不举行格局严厉检讨
    if((int)cp.GetReturnValue("@res")==-1)
    {
     string xml="<NewDataSet></NewDataSet>";
     xd.LoadXml(xml);
     return xd;
    }
    xd=new XmlDataDocument(cp.myData);
    XmlNode root1=xd.DocumentElement;
    XmlNodeList roots=root1.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;
  }
这是获取资源站点信息的一个接口函数.里边大局部的代码,我想对于有必定asp.net基本的良友来说,都应当是一看就清楚,这里只阐明下CStoreProc,这是我封装的一个存储过程类,重要功效是执行各门类型的存储过程.
         仔细的友人也许会发明这个函数的归来类别好像比拟特别,是个xml的文档.我们在前面曾经说过,webservice只能传输序列化数据,xml明显知足条件,但譬如hash表之类的非序列化数据,是不能传输的,xml应用最为普遍,况且斟酌到跨平台利用,因而此处我们只以xml数据的传输来举例.
       函数功效很简单,只是要归来查询成果,其数据格局是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("<NewDataSet xmlns=\"\"></NewDataSet>"))
    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,这是通用的方式,假如是刚往来不久的友人,优秀能记下这种办法.   ,congshuang7172;   接下来给出异步调用两个效力的代码
//绑定数据
  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("<NewDataSet xmlns=\"\"></NewDataSet>"))
    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("</NewDataSet>","");
   str2=str2.Replace("<NewDataSet xmlns=\"\">","");
   str1.Append(str2.ToString());
   return str1;
  }
    这有两个需要留神的处所,一个是xml结构,还有就是异步调用的完成,请读者,自己懂得
    下面讲下穿过dll来引用webservice的方法,我只把流程介绍下.
    率先,在ie输进服务的地址,如:http://www.xxx.com/service.asmx
   然后写输入http://www.xxx.com/service.asmx?wsdl
   敞开后,另存为xxx.wsdl
   然后用vs的号令提醒符来编译:wsdl /namespace:SiteA ServiceA.wsdl
  天生名字空间为sitea的代办类
  最终csc /out:ServiceA.dll /t:library Service1.cs ,中间service1.cs为代办类文件
最终引用dll就能够了.
  到此地,我们的例子基础也就先容完了,乐荷,由于一己的缘故,最终一篇也许写的比拟匆促,十分羞愧.
相关的主题文章:

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2024-09-21  
1234567
891011121314
15161718192021
22232425262728
2930     

数据统计

  • 访问量: 401
  • 日志数: 30
  • 建立时间: 2010-04-17
  • 更新时间: 2010-05-25

RSS订阅

Open Toolbar