首先,我們必須了解什么是webservice.就概念上來說,可能比較復(fù)雜,不過我們可以有個(gè)宏觀的了解:webservice就是個(gè)對外的接口,里面有 函數(shù)可供外部客戶調(diào)用(注意:里面同樣有客戶不可調(diào)用的函數(shù)).假若我們是服務(wù)端,我們寫好了個(gè)webservice,然后把它給了客戶(同時(shí)我們給了他 們調(diào)用規(guī)則),客戶就可以在從服務(wù)端獲取信息時(shí)處于一個(gè)相對透明的狀態(tài).即是客戶不了解(也不需要)其過程,他們只獲取數(shù)據(jù).
webservice傳遞的數(shù)據(jù)只能是序列化的數(shù)據(jù),典型的就是xml數(shù)據(jù),這里我們也只討論xml數(shù)據(jù)的傳輸.
有了一些對xml webservice的初步了解后,我們將切入正題,即是用一個(gè)具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個(gè)概念我想怎么也要比單純的說理能讓人容易理解吧.
這里,我們將以一個(gè)簡單的分布式課件搜索系統(tǒng)為例來講解.使用vs2003為編譯環(huán)境,c#為語言,sqlservcer2000為數(shù)據(jù)庫.(這個(gè)例子來 源于一位網(wǎng)上朋友的文章的啟發(fā),覺得很能代表webservice的特點(diǎn),就按那個(gè)想法做了這么個(gè)系統(tǒng)來示例了)
首先,明確我們要做什么.我們需要一個(gè)對客戶的接口,也就是個(gè)站點(diǎn),我們把它稱做servicegathersite,它是何種形式都無所謂,甚至它本身 并不需要數(shù)據(jù)庫,它只是提供給用戶一個(gè)查詢的接口,真正的服務(wù),普通用戶是不接觸到的.然后,這里我們還需要若干個(gè)提供服務(wù)的站點(diǎn),我們可以稱它們?yōu)橘Y源 站,這里為簡單起見,假設(shè)有兩個(gè)資源站,分別叫websitea,websiteb,它們可以是不對外公布的,只是為了豐富查詢數(shù)據(jù)而存在.最后,是我們 最需要關(guān)注的東西---資源站提供給servicegathersite的服務(wù).兩個(gè)資源站,就有兩個(gè)服務(wù),我們稱為siteaservice和 sitebservice.兩個(gè)服務(wù)間沒有任何關(guān)系,內(nèi)部提供的方法也完全沒關(guān)聯(lián),只是需要把方法如何使用告訴servicegathersite,意思 是,服務(wù)只提供查詢接口,返回的數(shù)據(jù)如何處理,服務(wù)本身并不管,全由使用服務(wù)的站點(diǎn)分配.
寫了這么多,算是簡要的介紹了下有關(guān)xml webservice的概念和我們這個(gè)例子的結(jié)構(gòu),下篇文章,我們將開始真正進(jìn)入代碼的設(shè)計(jì)階段.
上篇文章介紹了些webservice的基本特性和我們例子的結(jié)構(gòu),這篇文章我們將開始具體的代碼編寫工作.
這個(gè)專題主要講述的是webservice,因此這里我們的代碼以webservice相關(guān)為主,而其他工程,例如:servicegathersite,websitea等,只將簡略介紹.
在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)行,你就可以得 到最簡單的webservice運(yùn)行實(shí)例了.點(diǎn)擊"helloworld"將執(zhí)行其方法.顯然,這個(gè)函數(shù)對我們的意義只在于宏觀的了解了下web服務(wù)的寫 法.
下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個(gè)函數(shù)后,希望此函數(shù)成為外部可調(diào)用的接口函數(shù),我們必須在函數(shù)上面 添上一行代碼[webmethod(description="函數(shù)的描述信息")],如果你的函數(shù)沒有這個(gè)申明,它將不能被用戶引用.如:
這是獲取資源站點(diǎn)信息的一個(gè)接口函數(shù).里面大部分的代碼,我想對于有一定asp.net基礎(chǔ)的朋友來說,都應(yīng)該是一看就明白,這里只說明下cstoreproc,這是我封裝的一個(gè)存儲過程類,主要功能是執(zhí)行各種類型的存儲過程.
細(xì)心的朋友可能會發(fā)現(xiàn)這個(gè)函數(shù)的返回類型似乎比較特殊,是個(gè)xml的文檔.我們在前面已經(jīng)說過,webservice只能傳輸序列化數(shù)據(jù),xml顯然滿足 條件,但比如hash表之類的非序列化數(shù)據(jù),是不能傳輸?shù)?xml使用最為廣泛,而且考慮到跨平臺應(yīng)用,所以這里我們只以xml數(shù)據(jù)的傳輸來示例.
接上篇文章,我們先簡單解釋下getsiteadata(string assignname)函數(shù).
函數(shù)功能很簡單,只是要返回查詢結(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ù)是針對資源站點(diǎn)a的,我們不妨稱其為servicea.先單獨(dú)運(yùn)行asmx文件,執(zhí)行g(shù)etsiteadata (string assignname)方法,將提示你輸入?yún)?shù),你輸入要搜索的內(nèi)容,點(diǎn)確認(rèn),將返回給你一個(gè)xml數(shù)據(jù),并在ie上顯示出來,這就是你搜索到的內(nèi)容拉.
這里對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í)其他平臺的調(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)用似乎變的那么簡單,我們已經(jīng)實(shí)現(xiàn)了遠(yuǎn)程實(shí)例化,接下來的遠(yuǎn)程調(diào)用也是一樣的容易.下面給出資源采集站servicegathersite的綁定代碼(只采集a站點(diǎn)的信息)
此段代碼給出了xml轉(zhuǎn)化成dataset的解決方案,雖然這不是必須的,但畢竟在asp.net里,dataset占的作用之重,誰都知道的.其他的請 朋友們先看(呵呵,個(gè)中高手就免了),在下篇文章中將會有對它的一些解釋與及多服務(wù)分布調(diào)用的解決方案,寫了三篇了,發(fā)現(xiàn)似乎還是有些朋友看的,那我就獻(xiàn) 丑繼續(xù)寫下去好了,大家有什么意見也希望提出,在下的理解存在偏駁也再所難免,希望諒解:)
接上篇文章,我們先簡單說明下綁定函數(shù).首先實(shí)例化servicea,這個(gè)和一般類的實(shí)例化并沒有不同..接下來用xmlnode1來接受函數(shù)的返回值,接下來是構(gòu)造xml,并將其轉(zhuǎn)化為dataset,這是通用的方法,如果是剛接觸不久的朋友,最好能記下這種方法.
接下來給出異步調(diào)用兩個(gè)服務(wù)的代碼
這有兩個(gè)需要注意的地方,一個(gè)是xml構(gòu)造,還有就是異步調(diào)用的實(shí)現(xiàn),請讀者,自己理解
下面講下通過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就可以了.
新聞熱點(diǎn)
疑難解答
圖片精選