基于.NET的WebService的实现
???? 在VS2003中,開發(fā)一個(gè)webservice并不是件困難的事,首先,我們新建一個(gè)webservice項(xiàng)目(文件->新建->項(xiàng)目->C#->Web服務(wù)應(yīng)用程序)
???? 建完這個(gè)工程,我們將看到一個(gè)叫Service1.asmx的文件,這就是webservice的標(biāo)準(zhǔn)文件,它也有UI的概念,不過我們一般不關(guān)注,因此,我們查看其cs代碼文件.如果你什么都還沒做的話,將看見一個(gè)被注釋掉的helloworld的WebMethod,把注釋去掉,在運(yùn)行,你就可以得到最簡(jiǎn)單的webservice運(yùn)行實(shí)例了.點(diǎn)擊"helloworld"將執(zhí)行其方法.顯然,這個(gè)函數(shù)對(duì)我們的意義只在于宏觀的了解了下web服務(wù)的寫法.
???? 下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個(gè)函數(shù)后,希望此函數(shù)成為外部可調(diào)用的接口函數(shù),我們必須在函數(shù)上面添上一行代碼[WebMethod(Description="函數(shù)的描述信息")],如果你的函數(shù)沒有這個(gè)申明,它將不能被用戶引用.如:
view plaincopy to clipboardprint?
???? 這個(gè)函數(shù)就是外部可調(diào)用的接口函數(shù),對(duì)用戶來說相當(dāng)于一個(gè)API.如果某用戶在引用了這個(gè)服務(wù)后,他調(diào)用HelloWorld()方法,他就將獲得"HelloWorld"這個(gè)返回值.
????? 看到這里,我們是不是發(fā)現(xiàn),其實(shí)webservice并不是那么的神秘,它也不過只是個(gè)接口,對(duì)我們而言,側(cè)重點(diǎn)依然是接口函數(shù)的編寫.下面,我將給出我們的例子所需要的接口函數(shù).
view plaincopy to clipboardprint?
[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()) //如果執(zhí)行成功,存儲(chǔ)過程{cp.myData.EnforceConstraints=false; //不進(jìn)行格式嚴(yán)格檢查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) //為所有元素加上站點(diǎn)名稱標(biāo)記{XmlElement Link=xd.CreateElement("SiteName");Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();roota.AppendChild(Link);}return xd;}else return null;}
這是獲取資源站點(diǎn)信息的一個(gè)接口函數(shù).里面大部分的代碼,我想對(duì)于有一定asp.net基礎(chǔ)的朋友來說,都應(yīng)該是一看就明白,這里只說明下CStoreProc,這是我封裝的一個(gè)存儲(chǔ)過程類,主要功能是執(zhí)行各種類型的存儲(chǔ)過程.
??????? 細(xì)心的朋友可能會(huì)發(fā)現(xiàn)這個(gè)函數(shù)的返回類型似乎比較特殊,是個(gè)xml的文檔.我們?cè)谇懊嬉呀?jīng)說過,webservice只能傳輸序列化數(shù)據(jù),xml顯然滿足條件,但比如hash表之類的非序列化數(shù)據(jù),是不能傳輸?shù)?xml使用最為廣泛,而且考慮到跨平臺(tái)應(yīng)用,所以這里我們只以xml數(shù)據(jù)的傳輸來示例.
函數(shù)功能很簡(jiǎn)單,只是要返回查詢結(jié)果,其數(shù)據(jù)格式是XmlDataDocument.當(dāng)查詢失敗時(shí)(無匹配查詢結(jié)果),我們構(gòu)造一個(gè)xml,返回一個(gè)空記錄.否則,我們把查詢后的dataset生成一個(gè)XmlDataDocument,接下來,由于該項(xiàng)目的需要,我加入了一個(gè)循環(huán),添加dataset里所沒有的節(jié)點(diǎn),站點(diǎn)名稱.在這之后,算是完成了一個(gè)符合我們期望格式的xml數(shù)據(jù)文檔,我們把它返回.
??????? 好了,webservice的方法函數(shù)介紹完了(這里還有個(gè)web服務(wù)方法,稍后介紹),接下來我們的任務(wù)是怎么調(diào)用它了.首先把webservice的項(xiàng)目編譯完成,假定我們這個(gè)服務(wù)是針對(duì)資源站點(diǎn)A的,我們不妨稱其為ServiceA.先單獨(dú)運(yùn)行asmx文件,執(zhí)行GetSiteAData(string AssignName)方法,將提示你輸入?yún)?shù),你輸入要搜索的內(nèi)容,點(diǎn)確認(rèn),將返回給你一個(gè)xml數(shù)據(jù),并在ie上顯示出來,這就是你搜索到的內(nèi)容拉.
?????? 這里對(duì)ServiceA的工作再做點(diǎn)介紹,在我們這個(gè)項(xiàng)目里,它是資源站點(diǎn)A提供的服務(wù),意思是,它查詢的數(shù)據(jù)將全來源于站點(diǎn)A,而站點(diǎn)A資源添加在本項(xiàng)目也有專門的工程實(shí)現(xiàn).
?????? 好了,回到正題.這里我介紹vs調(diào)用webservice的方法,其實(shí)其他平臺(tái)的調(diào)用方法也是大同小異.首先我們介紹web引用方式,這種方式我強(qiáng)烈建議調(diào)試時(shí)使用,非常方便.右擊引用,點(diǎn)添加web引用,輸入你的webservice地址,如:http://localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必須保證你輸入的webservice存在.然后引用即可,注意:web引用名將作為你加入的webservice的名字空間.比如你輸入了:SiteA,那服務(wù)的實(shí)例化將是這樣:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服務(wù)的類名).
?????? 完成了這一步,service的調(diào)用似乎變的那么簡(jiǎn)單,我們已經(jīng)實(shí)現(xiàn)了遠(yuǎn)程實(shí)例化,接下來的遠(yuǎn)程調(diào)用也是一樣的容易.下面給出資源采集站ServiceGatherSite的綁定代碼(只采集A站點(diǎn)的信息)
//綁定數(shù)據(jù)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) //--存儲(chǔ)過程執(zhí)行失敗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轉(zhuǎn)化成dataset的解決方案,雖然這不是必須的,但畢竟在asp.net里,dataset占的作用之重,誰都知道的.其他的請(qǐng)朋友們先看(呵呵,個(gè)中高手就免了)
先簡(jiǎn)單說明下綁定函數(shù).首先實(shí)例化ServiceA,這個(gè)和一般類的實(shí)例化并沒有不同..接下來用xmlNode1來接受函數(shù)的返回值,接下來是構(gòu)造xml,并將其轉(zhuǎn)化為dataset,這是通用的方法,如果是剛接觸不久的朋友,最好能記下這種方法.
???? 接下來給出異步調(diào)用兩個(gè)服務(wù)的代碼
//綁定數(shù)據(jù)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;//--簡(jiǎn)單的異步調(diào)用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) //--存儲(chǔ)過程執(zhí)行失敗return;xmlString1=new StringBuilder(xmlNode1.OuterXml);xmlString2=new StringBuilder(xmlNode2.OuterXml);xmlString1=MakeNewXmlString(xmlString1,xmlString2); //生成新的xmlif(xmlString1.ToString().Equals("<NewDataSet xmlns=\"\"></NewDataSet>"))return ;xd.LoadXml(xmlString1.ToString());ds.ReadXml(new XmlNodeReader(xd));DataGrid1.DataSource=ds.Tables["list"].DefaultView;DataGrid1.DataBind();}//生成新XMLpublic StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2){str1=str1.Replace("</NewDataSet>","");str2=str2.Replace("<NewDataSet xmlns=\"\">","");str1.Append(str2.ToString());return str1;}
?? 這有兩個(gè)需要注意的地方,一個(gè)是xml構(gòu)造,還有就是異步調(diào)用的實(shí)現(xiàn),請(qǐng)讀者,自己理解
?? 下面講下通過dll來引用webservice的方法,我只把流程介紹下.
?? 首先,在ie輸入服務(wù)的地址,如: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就可以了.
到這里,我們的例子基本也就介紹完了,由于個(gè)人的原因,最后一篇可能寫的比較倉促,非常慚愧.
不知道寫這么多,對(duì)學(xué)習(xí)中的朋友會(huì)不會(huì)有幫助,里面的東西,很多也算是個(gè)人理解,如果出錯(cuò),還請(qǐng)各位海涵:)
總結(jié)
以上是生活随笔為你收集整理的基于.NET的WebService的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洁立汾洗衣粉是立白生产的吗?
- 下一篇: Java调用.NET的WCF