一个webservice的初级例子
首先,我們必須了解什么是webservice.就概念上來(lái)說(shuō),可能比較復(fù)雜,不過(guò)我們可以有個(gè)宏觀的了解:webservice就是個(gè)對(duì)外的接口,里面有函數(shù)可供外部客戶調(diào)用(注意:里面同樣有客戶不可調(diào)用的函數(shù)).假若我們是服務(wù)端,我們寫好了個(gè)webservice,然后把它給了客戶(同時(shí)我們給了他們調(diào)用規(guī)則),客戶就可以在從服務(wù)端獲取信息時(shí)處于一個(gè)相對(duì)透明的狀態(tài).即是客戶不了解(也不需要)其過(guò)程,他們只獲取數(shù)據(jù).
??? webservice傳遞的數(shù)據(jù)只能是序列化的數(shù)據(jù),典型的就是xml數(shù)據(jù),這里我們也只討論xml數(shù)據(jù)的傳輸.
??? 有了一些對(duì)xml webservice的初步了解后,我們將切入正題,即是用一個(gè)具體的webservice事例的形式來(lái)講解具體的webservice用法,用具體的事例來(lái)講解一個(gè)概念我想怎么也要比單純的說(shuō)理能讓人容易理解吧.
??? 這里,我們將以一個(gè)簡(jiǎn)單的分布式課件搜索系統(tǒng)為例來(lái)講解.使用VS2003為編譯環(huán)境,C#為語(yǔ)言,SqlServcer2000為數(shù)據(jù)庫(kù).(這個(gè)例子來(lái)源于一位網(wǎng)上朋友的文章的啟發(fā),覺得很能代表webservice的特點(diǎn),就按那個(gè)想法做了這么個(gè)系統(tǒng)來(lái)示例了)
??? 首先,明確我們要做什么.我們需要一個(gè)對(duì)客戶的接口,也就是個(gè)站點(diǎn),我們把它稱做ServiceGatherSite,它是何種形式都無(wú)所謂,甚至它本身并不需要數(shù)據(jù)庫(kù),它只是提供給用戶一個(gè)查詢的接口,真正的服務(wù),普通用戶是不接觸到的.然后,這里我們還需要若干個(gè)提供服務(wù)的站點(diǎn),我們可以稱它們?yōu)橘Y源站,這里為簡(jiǎn)單起見,假設(shè)有兩個(gè)資源站,分別叫WebSiteA,WebSiteB,它們可以是不對(duì)外公布的,只是為了豐富查詢數(shù)據(jù)而存在.最后,是我們最需要關(guān)注的東西---資源站提供給ServiceGatherSite的服務(wù).兩個(gè)資源站,就有兩個(gè)服務(wù),我們稱為SiteAService和SiteBService.兩個(gè)服務(wù)間沒(méi)有任何關(guān)系,內(nèi)部提供的方法也完全沒(méi)關(guān)聯(lián),只是需要把方法如何使用告訴ServiceGatherSite,意思是,服務(wù)只提供查詢接口,返回的數(shù)據(jù)如何處理,服務(wù)本身并不管,全由使用服務(wù)的站點(diǎn)分配.
???? 寫了這么多,算是簡(jiǎn)要的介紹了下有關(guān)xml webservice的概念和我們這個(gè)例子的結(jié)構(gòu),下篇文章,我們將開始真正進(jìn)入代碼的設(shè)計(jì)階段.
??????? 在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ò)我們一般不關(guān)注,因此,我們查看其cs代碼文件.如果你什么都還沒(méi)做的話,將看見一個(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ù)沒(méi)有這個(gè)申明,它將不能被用戶引用.如:
[WebMethod(Description="最簡(jiǎn)單的方法")]
? public string HelloWorld()
? {
?? return "Hello World";
? }
??? 這個(gè)函數(shù)就是外部可調(diào)用的接口函數(shù),對(duì)用戶來(lái)說(shuō)相當(dāng)于一個(gè)API.如果某用戶在引用了這個(gè)服務(wù)后,他調(diào)用HelloWorld()方法,他就將獲得"HelloWorld"這個(gè)返回值.
??? 看到這里,我們是不是發(fā)現(xiàn),其實(shí)webservice并不是那么的神秘,它也不過(guò)只是個(gè)接口,對(duì)我們而言,側(cè)重點(diǎn)依然是接口函數(shù)的編寫.下面,我將給出我們的例子所需要的接口函數(shù).
?[WebMethod(Description="查詢以獲取需要的課件信息")]
? public XmlDataDocument GetSiteAData(string AssignName)
? {
?? DataSet dsNorthwind = new DataSet();
? //Create the connection string.??????????
?? String sConnect;
?? sConnect="Password=eaiuser;User ID=eaiuser;Data Source=eaitest";????
????????
?? //Create a connection object to connect to the northwind db.
?? OracleConnection nwconnect = new OracleConnection(sConnect);
??? //Create a command string to select all the customers in the WA region.
?? String sCommand = "Select * from users";
??? //Create an adapter to load the DataSet.
?? OracleDataAdapter myDataAdapter = new OracleDataAdapter(sCommand, nwconnect);
??? //Fill the DataSet with the selected records.
?? myDataAdapter.Fill(dsNorthwind,"users");
??? //Load the document with the DataSet.
?? XmlDataDocument doc = new XmlDataDocument(dsNorthwind);??
???? //Display the XmlDataDocument.
?? doc.Save(Console.Out);
???? if(true) //如果執(zhí)行成功,存儲(chǔ)過(guò)程
?? {
??? XmlNode root1=doc.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 doc;
?? }
?? else return null;
}
?
?????????? 這是獲取資源站點(diǎn)信息的一個(gè)接口函數(shù).里面大部分的代碼,我想對(duì)于有一定asp.net基礎(chǔ)的朋友來(lái)說(shuō),都應(yīng)該是一看就明白,這里只說(shuō)明下CStoreProc,這是我封裝的一個(gè)存儲(chǔ)過(guò)程類,主要功能是執(zhí)行各種類型的存儲(chǔ)過(guò)程.
????????? 細(xì)心的朋友可能會(huì)發(fā)現(xiàn)這個(gè)函數(shù)的返回類型似乎比較特殊,是個(gè)xml的文檔.我們?cè)谇懊嬉呀?jīng)說(shuō)過(guò),webservice只能傳輸序列化數(shù)據(jù),xml顯然滿足條件,但比如hash表之類的非序列化數(shù)據(jù),是不能傳輸?shù)?xml使用最為廣泛,而且考慮到跨平臺(tái)應(yīng)用,所以這里我們只以xml數(shù)據(jù)的傳輸來(lái)示例.
????????? 函數(shù)功能很簡(jiǎn)單,只是要返回查詢結(jié)果,其數(shù)據(jù)格式是XmlDataDocument.當(dāng)查詢失敗時(shí)(無(wú)匹配查詢結(jié)果),我們構(gòu)造一個(gè)xml,返回一個(gè)空記錄.否則,我們把查詢后的dataset生成一個(gè)
????? 好了,webservice的方法函數(shù)介紹完了(這里還有個(gè)web服務(wù)方法,稍后介紹),接下來(lái)我們的任務(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上顯示出來(lái),這就是你搜索到的內(nèi)容拉.
??????? 這里對(duì)ServiceA的工作再做點(diǎn)介紹,在我們這個(gè)項(xiàng)目里,它是資源站點(diǎn)A提供的服務(wù),意思是,它查詢的數(shù)據(jù)將全來(lái)源于站點(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ù)的類名).另一種引用的方法是產(chǎn)生一個(gè)代理類,編譯成dll,在引用的地方把這個(gè)dll引用進(jìn)去,不過(guò)這種方法有個(gè)缺點(diǎn):就是當(dāng)web服務(wù)修改了以后必須重新編譯
文章來(lái)自學(xué)IT網(wǎng):http://www.xueit.com/html/2008-12/2_212_00.html
轉(zhuǎn)載于:https://www.cnblogs.com/lhuser/articles/1505919.html
總結(jié)
以上是生活随笔為你收集整理的一个webservice的初级例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: flash新闻图片轮转————c#+数据
- 下一篇: Function in loop and