加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

基于.NET的WebService的实现

发布时间:2020-12-17 00:10:54 所属栏目:安全 来源:网络整理
导读:这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍. ???? 在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件-新建-项目-C#-Web服务应
这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.

???? 在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->项目->C#->Web服务应用程序)

???? 建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不关注,因此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.

???? 下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:
view plain copy to clipboard print ?
  1. [WebMethod(Description="最简单的方法")]??
  2. ? public string HelloWorld()??
  3. ? {??
  4. ?? return "Hello World";??
  5. ? }???


???? 这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.

????? 看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.
view plain copy to clipboard print ?
  1. [WebMethod(Description="查询以获取需要的课件信息")]??
  2. public XmlDataDocument GetSiteAData(string AssignName)??
  3. {??
  4. ? XmlDataDocument xd=new XmlDataDocument(); // ?
  5. ? DataSet ds=new DataSet();??
  6. ? CStoreProc cp=new CStoreProc("SearchAssign");??
  7. ? cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);??
  8. ? cp.AddParOut("@res",SqlDbType.Int);??
  9. ? if(cp.SelectProc()) //如果执行成功,存储过程 ?
  10. ? {??
  11. ?? cp.myData.EnforceConstraints=false; //不进行格式严格检查 ?
  12. ?? if((int)cp.GetReturnValue("@res")==-1)??
  13. ?? {??
  14. ??? string xml="<NewDataSet></NewDataSet>";??
  15. ??? xd.LoadXml(xml);??
  16. ??? return xd;??
  17. ?? }??
  18. ?? xd=new XmlDataDocument(cp.myData);??
  19. ?? XmlNode root1=xd.DocumentElement;???
  20. ?? XmlNodeList roots=root1.SelectNodes("list");?????
  21. ?? foreach(XmlNode roota in? roots)? //为所有元素加上站点名称标记 ?
  22. ? {??
  23. ??? XmlElement Link=xd.CreateElement("SiteName");???
  24. ??? Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();??
  25. ??? roota.AppendChild(Link);??
  26. ?
  27. ?? }??
  28. ?? return xd;??
  29. ? }??
  30. ? else return null;??
  31. }???


这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定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站点的信息)

view plain copy to clipboard print ?
  1. //绑定数据 ?
  2. ? public void BindData()??
  3. ? {??
  4. ?? serviceA=new SiteA.Service1();??
  5. ?? DataSet ds=new DataSet();??
  6. ?? XmlNode xmlNode1;??
  7. ?? XmlDataDocument xd=new XmlDataDocument();??
  8. ?? StringBuilder xmlString1;??
  9. ?? xmlNode1=serviceA.GetSiteAData(strSearch);??
  10. ?? if(xmlNode1==null) //--存储过程执行失败 ?
  11. ??? return;??
  12. ?
  13. ?? xmlString1=new StringBuilder(xmlNode1.OuterXml);??
  14. ?? if(xmlString1.ToString().Equals("<NewDataSet xmlns=""></NewDataSet>"))??
  15. ??? return ;??
  16. ?? xd.LoadXml(xmlString1.ToString());??
  17. ?? ds.ReadXml(new XmlNodeReader(xd));??
  18. ?? DataGrid1.DataSource=ds.Tables["list"].DefaultView;??
  19. ?? DataGrid1.DataBind();??
  20. ? }??


?????? 此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在asp.net里,dataset占的作用之重,谁都知道的.其他的请朋友们先看(呵呵,个中高手就免了)

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

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

view plain copy to clipboard print ?
  1. //绑定数据 ?
  2. ? public void BindData()??
  3. ? {??
  4. ?? IAsyncResult ar1;??
  5. ?? IAsyncResult ar2;??
  6. ?? serviceA=new SiteA.Service1();??
  7. ?? serviceB=new SiteB.Service1();??
  8. ?? DataSet ds=new DataSet();??
  9. ?? XmlNode xmlNode1,xmlNode2;??
  10. ?? XmlDataDocument xd=new XmlDataDocument();??
  11. ?? StringBuilder xmlString1,xmlString2;??
  12. ?? //--简单的异步调用 ?
  13. ?? ar1=serviceA.BeginGetSiteAData(strSearch,null,null);??
  14. ?? ar2=serviceB.BeginGetSiteAData(strSearch,null);??
  15. ?? xmlNode1=serviceA.EndGetSiteAData(ar1);??
  16. ?? xmlNode2=serviceB.EndGetSiteAData(ar2);??
  17. ?? //---------- ?
  18. ?? if(xmlNode1==null&&xmlNode2==null) //--存储过程执行失败 ?
  19. ??? return;??
  20. ?
  21. ?? xmlString1=new StringBuilder(xmlNode1.OuterXml);??
  22. ?? xmlString2=new StringBuilder(xmlNode2.OuterXml);??
  23. ?? xmlString1=MakeNewXmlString(xmlString1,xmlString2);? //生成新的xml ?
  24. ?? if(xmlString1.ToString().Equals("<NewDataSet xmlns=""></NewDataSet>"))??
  25. ??? return ;??
  26. ?? xd.LoadXml(xmlString1.ToString());??
  27. ?? ds.ReadXml(new XmlNodeReader(xd));??
  28. ?? DataGrid1.DataSource=ds.Tables["list"].DefaultView;??
  29. ?? DataGrid1.DataBind();??
  30. ? }??
  31. ?
  32. ? //生成新XML ?
  33. ? public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)??
  34. ? {??
  35. ?? str1=str1.Replace("</NewDataSet>","");??
  36. ?? str2=str2.Replace("<NewDataSet xmlns="">","");??
  37. ?? str1.Append(str2.ToString());??
  38. ?? return str1;??
  39. ? }??

?? 这有两个需要注意的地方,一个是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就可以了. 到这里,我们的例子基本也就介绍完了,由于个人的原因,最后一篇可能写的比较仓促,非常惭愧. 不知道写这么多,对学习中的朋友会不会有帮助,里面的东西,很多也算是个人理解,如果出错,还请各位海涵:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读