仓酷云
标题:
ASP.NET教程之XML WebService完整实例具体剖析
[打印本页]
作者:
海妖
时间:
2015-1-16 22:48
标题:
ASP.NET教程之XML WebService完整实例具体剖析
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)web|xml 起首,我们必需懂得甚么是webservice.就观点下去说,大概对照庞大,不外我们能够有个微观的懂得:webservice就是个对外的接口,内里有函数可供内部客户挪用(注重:内里一样有客户不成挪用的函数).倘使我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们挪用划定规矩),客户就能够在从服务端猎取信息时处于一个绝对通明的形态.便是客户不懂得(也不必要)其历程,他们只猎取数据.
webservice传送的数据只能是序列化的数据,典范的就是xml数据,这里我们也只会商xml数据的传输.
有了一些对xmlwebservice的开端懂得后,我们将切进正题,便是用一个详细的webservice事例的情势来说解详细的webservice用法,器具体的事例来说解一个观点我想怎样也要比纯真的说理能让人简单了解吧.
这里,我们将以一个复杂的散布式课件搜刮体系为例来说解.利用VS2003为编译情况,C#为言语,SqlServcer2000为数据库.(这个例子来源于一名网上伴侣的文章的启示,以为很能代表webservice的特性,就按谁人设法做了这么个体系来示例了)
起首,明白我们要做甚么.我们必要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种情势都无所谓,乃至它自己其实不必要数据库,它只是供应给用户一个查询的接口,真实的服务,一般用户是不打仗到的.然后,这里我们还必要多少个供应服务的站点,我们能够称它们为资本站,这里为复杂起见,假定有两个资本站,分离叫WebSiteA,WebSiteB,它们能够是不合错误外发布的,只是为了丰厚查询数据而存在.最初,是我们最必要存眷的器材---资本站供应给ServiceGatherSite的服务.两个资本站,就有两个服务,我们称为SiteAService和SiteBService.两个服务间没有任何干系,外部供应的办法也完整没联系关系,只是必要把办法怎样利用告知ServiceGatherSite,意义是,服务只供应查询接口,前往的数据怎样处置,服务自己其实不管,全由利用服务的站点分派.
写了这么多,算是扼要的先容了下有关xmlwebservice的观点和我们这个例子的布局,下篇文章,我们将入手下手真正进进代码的计划阶段.
上篇文章先容了些webservice的基础特征和我们例子的布局,这篇文章我们将入手下手详细的代码编写事情.
这个专题次要报告的是webservice,因而这里我们的代码以Webservice相干为主,而其他工程,比方:ServiceGatherSite,WebSiteA等,只将大略先容.
在VS2003中,开辟一个webservice并非件坚苦的事,起首,我们新建一个webservice项目(文件->新建->项目->C#->Web服务使用程序)
建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的尺度文件,它也有UI的观点,不外我们一样平常不存眷,因此,我们检察其cs代码文件.假如你甚么都还没做的话,将瞥见一个被正文失落的helloworld的WebMethod,把正文往失落,在运转,你就能够得到最复杂的webservice运转实例了.点击"helloworld"将实行其办法.明显,这个函数对我们的意义只在于微观的懂得了下web服务的写法.
上面,我们将入手下手详细先容webservice的写法.在代码文件里,假如我们写了一个函数后,但愿此函数成为内部可挪用的接口函数,我们必需在函数下面添上一行代码[WebMethod(Description="函数的形貌信息")],假如你的函数没有这个声名,它将不克不及被用户援用.如:
<P> [WebMethod(Description="最复杂的办法")]
publicstringHelloWorld()
{
return"HelloWorld";
}
这个函数就是内部可挪用的接口函数,对用户来讲相称于一个API.假如某用户在援用了这个服务后,他挪用HelloWorld()办法,他就将取得"HelloWorld"这个前往值.
看到这里,我们是否是发明,实在webservice并非那末的奥秘,它也不外只是个接口,对我们而言,偏重点仍然是接口函数的编写.上面,我将给出我们的例子所必要的接口函数.
[WebMethod(Description="查询以猎取必要的课件信息")]
publicXmlDataDocumentGetSiteAData(stringAssignName)
{
XmlDataDocumentxd=newXmlDataDocument();//
DataSetds=newDataSet();
CStoreProccp=newCStoreProc("SearchAssign");
cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);
cp.AddParOut("@res",SqlDbType.Int);
if(cp.SelectProc())//假如实行乐成,存储历程
{
cp.myData.EnforceConstraints=false;//不举行格局严厉反省
if((int)cp.GetReturnValue("@res")==-1)
{
stringxml="";
xd.LoadXml(xml);
returnxd;
}
xd=newXmlDataDocument(cp.myData);
XmlNoderoot1=xd.DocumentElement;
XmlNodeListroots=root1.SelectNodes("list");
foreach(XmlNoderootainroots)//为一切元素加上站点称号标志
{
XmlElementLink=xd.CreateElement("SiteName");
Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();
roota.AppendChild(Link);
}
returnxd;
}
elsereturnnull;
}
这是猎取资本站点信息的一个接口函数.内里年夜部分的代码,我想关于有必定asp.net基本的伴侣来讲,都应当是一看就分明,这里只申明下CStoreProc,这是我封装的一个存储历程类,次要功效是实行各类范例的存储历程.
仔细的伴侣大概会发明这个函数的前往范例仿佛对照特别,是个xml的文档.我们在后面已说过,webservice只能传输序列化数据,xml明显满意前提,但好比hash表之类的非序列化数据,是不克不及传输的,xml利用最为普遍,并且思索到跨平台使用,以是这里我们只以xml数据的传输来示例.
接上篇文章,我们先复杂注释下GetSiteAData(stringAssignName)函数.
函数功效很复杂,只是要前往查询了局,其数据格局是XmlDataDocument.当查询失利时(无婚配查询了局),我们机关一个xml,前往一个空记录.不然,我们把查询后的dataset天生一个XmlDataDocument,接上去,因为该项目标必要,我到场了一个轮回,增加dataset里所没有的节点,站点称号.在这以后,算是完成了一个切合我们希冀格局的xml数据文档,我们把它前往.
好了,webservice的办法函数先容完了(这里另有个web服务办法,稍后先容),接上去我们的义务是怎样挪用它了.起首把webservice的项目编译完成,假定我们这个服务是针对资本站点A的,我们无妨称其为ServiceA.先独自运转asmx文件,实行GetSiteAData(stringAssignName)办法,将提醒你输出参数,你输出要搜刮的内容,点确认,将前往给你一个xml数据,并在ie上显现出来,这就是你搜刮到的内容拉.
这里对ServiceA的事情再做点先容,在我们这个项目里,它是资本站点A供应的服务,意义是,它查询的数据将全来历于站点A,而站点A资本增加在本项目也有专门的工程完成.
好了,回到正题.这里我先容vs挪用webservice的办法,实在其他平台的挪用办法也是迥然不同.起首我们先容web援用体例,这类体例我激烈倡议调试时利用,十分便利.右击援用,点增加web援用,输出你的webservice地点,如:http://localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必须包管你输出的webservice存在.然后援用便可,注重:web援用名将作为你到场的webservice的名字空间.好比你输出了:SiteA,那服务的实例化将是如许:SiteA.Service1serviceA=newSiteA.Service1();(Service1是服务的类名).
完成了这一步,service的挪用仿佛变的那末复杂,我们已完成了远程实例化,接上去的远程挪用也是一样的简单.上面给出资本收罗站ServiceGatherSite的绑定代码(只收罗A站点的信息)
<P> //绑定命据
publicvoidBindData()
{
serviceA=newSiteA.Service1();
DataSetds=newDataSet();
XmlNodexmlNode1;
XmlDataDocumentxd=newXmlDataDocument();
StringBuilderxmlString1;
xmlNode1=serviceA.GetSiteAData(strSearch);
if(xmlNode1==null)//--存储历程实行失利
return;
xmlString1=newStringBuilder(xmlNode1.OuterXml);
if(xmlString1.ToString().Equals(""))
return;
xd.LoadXml(xmlString1.ToString());
ds.ReadXml(newXmlNodeReader(xd));
DataGrid1.DataSource=ds.Tables["list"].DefaultView;
DataGrid1.DataBind();
}
此段代码给出了xml转化成dataset的办理计划,固然这不是必需的,但究竟在asp.net里,dataset占的感化之重,谁都晓得的.其他的请伴侣们先看(呵呵,其中妙手就免了),鄙人篇文章中将会有对它的一些注释与及多服务散布挪用的办理计划,写了三篇了,发明仿佛仍是有些伴侣看的,那我就献丑持续写下往好了,人人有甚么定见也但愿提出,鄙人的了解存在偏驳也再所不免,但愿体谅:)
接上篇文章,我们先复杂申明下绑定函数.起首实例化ServiceA,这个和一样平常类的实例化并没有分歧..接上去用xmlNode1来承受函数的前往值,接上去是机关xml,并将其转化为dataset,这是通用的办法,假如是刚打仗不久的伴侣,最好能记下这类办法.
接上去给出异步伐用两个服务的代码
<P> //绑定命据
publicvoidBindData()
{
IAsyncResultar1;
IAsyncResultar2;
serviceA=newSiteA.Service1();
serviceB=newSiteB.Service1();
DataSetds=newDataSet();
XmlNodexmlNode1,xmlNode2;
XmlDataDocumentxd=newXmlDataDocument();
StringBuilderxmlString1,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=newStringBuilder(xmlNode1.OuterXml);
xmlString2=newStringBuilder(xmlNode2.OuterXml);
xmlString1=MakeNewXmlString(xmlString1,xmlString2);//天生新的xml
if(xmlString1.ToString().Equals(""))
return;
xd.LoadXml(xmlString1.ToString());
ds.ReadXml(newXmlNodeReader(xd));
DataGrid1.DataSource=ds.Tables["list"].DefaultView;
DataGrid1.DataBind();
}
//天生新XML
publicStringBuilderMakeNewXmlString(StringBuilderstr1,StringBuilderstr2)
{
str1=str1.Replace("","");
str2=str2.Replace("","");
str1.Append(str2.ToString());
returnstr1;
}
这有两个必要注重的中央,一个是xml机关,另有就是异步伐用的完成,请读者,本人了解
上面讲下经由过程dll来援用webservice的办法,我只把流程先容下.
起首,在ie输出服务的地点,如:http://www.xxx.com/service.asmx
然后写输出http://www.xxx.com/service.asmx?wsdl
翻开后,另存为xxx.wsdl
然后用vs的命令提醒符来编译:wsdl/namespace:SiteAServiceA.wsdl
天生名字空间为sitea的代办署理类
最初csc/out:ServiceA.dll/t:libraryService1.cs,个中service1.cs为代办署理类文件
最初援用dll就能够了.
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)
作者:
仓酷云
时间:
2015-1-19 17:54
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
作者:
冷月葬花魂
时间:
2015-1-24 15:17
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
作者:
金色的骷髅
时间:
2015-2-1 18:02
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
作者:
柔情似水
时间:
2015-2-7 12:54
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
作者:
只想知道
时间:
2015-2-21 21:35
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者:
飘飘悠悠
时间:
2015-3-6 21:58
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
作者:
小女巫
时间:
2015-3-20 19:55
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2