在asp.net ajax中updatepanel比較常用,原本需要刷新的操作套在updatepanel中就成了ajax操作了,挺帥!但ajax也是支持與Xml Web Service交互的,這種方法更像是傳統(tǒng)的ajaxpro和其他ajax框架,如jquery,magicajax,extjs的風(fēng)格,但MS總是獨(dú)樹一幟,誰讓他的產(chǎn)品設(shè)計(jì)能力那么高呢!我輩恐怕望塵莫及亞.閑話少敘,下面簡單講述下asp.net ajax如何調(diào)用xml web service,熟悉的朋友就略過吧
1. 創(chuàng)建一個(gè)支持Asp.Net Ajax的網(wǎng)站或者網(wǎng)絡(luò)應(yīng)用程序,我使用的是vs2008,在vs2008中,如果建立的網(wǎng)站支持.net framework 3.5就有ajax的缺省支持,這陳芝麻,爛谷子的事情,也不多說。
2. 建立好項(xiàng)目之后,在網(wǎng)站根目錄中添加一個(gè)Web服務(wù)UserService.asmx,在UserService.asmx中添加如下方法:
注意服務(wù)類上部要添加Attribute
[System.Web.Script.Services.ScriptService]
3. 然后把default.aspx中的ScriptManager修改成如下代碼的德性:
下面我們就在頁面中創(chuàng)建用Ajax消費(fèi)這個(gè)UserService的代碼:主要包括如下:
在<head></head>添加如下腳本
4. 好,現(xiàn)在一個(gè)簡單的ajax調(diào)用web service的示例代碼已經(jīng)搞定,羅索了不少,其實(shí)簡單的不能再簡單,運(yùn)行頁面,點(diǎn)擊提交按鈕,效果如下:
表示成功。一般人這一步都會(huì)成功的。二般的除外亞,:)
一些正常,那是不是到這里就萬事大吉,ajax萬歲!web service真好!下面是略加思考之后的問題
問題一:
上面的Xml Web Service沒有任何保護(hù),如果UserAdd是一個(gè)數(shù)據(jù)庫插入操作,那這個(gè)操作往往系統(tǒng)只被經(jīng)過授權(quán)的人才能調(diào)用成功。以前看有朋友討論ajax如何調(diào)用帶有SoapHeader的xml web service,細(xì)細(xì)想想,其實(shí)沒什么必要!js是客戶端的東西,是放出去收不回來的玩意,天知道用戶是哪路貨色 ,如果將身份信息試圖通過js傳遞給SoapHeader,那密碼被截獲的可能性就比較大。正確的做法其實(shí)是Session .我們知道Web Service方法中添加一個(gè)[WebMethod(EnableSession=true)]就能使用Session了,Session這家伙專門用于保持會(huì)話,有這樣一個(gè) 認(rèn)識(shí)之后,新增一個(gè)網(wǎng)絡(luò)服務(wù)方法,這個(gè)方法實(shí)現(xiàn)功能和起初的UserAdd一致,只是添加上訪問限制
在頁面中將AjaxWs.UserService.UserAdd(name,pwd,userAddCallBack);更改為AjaxWs.UserService.UserAddSecurity(name,pwd,userAddCallBack);點(diǎn)擊提交按鈕,會(huì)發(fā)現(xiàn)彈出結(jié)果為false!
在頁面中添加一個(gè)按鈕,點(diǎn)擊這個(gè)按鈕模擬登陸,點(diǎn)擊代碼為:
點(diǎn)擊登陸按鈕后,再次點(diǎn)擊提交,便可以返回true。 這樣便限制了用戶對(duì)xml web service的訪問。達(dá)到了解決問題一的目的。
問題二:
這個(gè)問題涉及到xml web service架構(gòu)的缺陷,這個(gè)缺陷在WCF中已經(jīng)有所更正和彌補(bǔ)。我們知道web service是一種強(qiáng)度公開和共享的技術(shù),之所以稱之為服務(wù),必然是提供給其他應(yīng)用程序所使用。但事實(shí)上,有很多服務(wù)是服務(wù)于局部或者特殊個(gè)體的,而不是理想中的大眾。而在原來老的xml web service中,wsdl的發(fā)布與網(wǎng)絡(luò)服務(wù)的發(fā)布是綁在一起的,我將.asmx部署到iis中,那在這個(gè).asmx后加上?wsdl就能訪問服務(wù)的wsdl。wsdl是對(duì)服務(wù)的描述,知道它,便能開發(fā)客戶代理,從而消費(fèi)服務(wù),但這樣有問題:我的服務(wù)只想讓局部或者特殊的幾個(gè)人知道 ,其他人根本不想讓其訪問到。這就麻煩了。我發(fā)布.asmx,wsdl就發(fā)布。而wsdl的發(fā)現(xiàn)依靠的是UDDI,通過下面的一段描述:
UDDI 如何被使用
假如行業(yè)發(fā)布了一個(gè)用于航班比率檢測和預(yù)訂的 UDDI 標(biāo)準(zhǔn),航空公司就可以把它們的服務(wù)注冊到一個(gè) UDDI 目錄中。然后旅行社就能夠搜索這個(gè) UDDI 目錄以找到航空公司預(yù)訂界面。當(dāng)此界面被找到后,旅行社就能夠立即與此服務(wù)進(jìn)行通信,這樣由于它使用了一套定義良好的預(yù)訂界面。
如果遍歷UDDI目錄,不難發(fā)現(xiàn)WSDL,發(fā)現(xiàn)WSDL后便可以開發(fā)客戶端與服務(wù)交互。這可不是好事情,在問題一中,用授權(quán)的方法可以解決一種問題,但假如我的服務(wù)是這樣的,它返回服務(wù)器當(dāng)前時(shí)間,這個(gè)方法對(duì)于我網(wǎng)站的用戶而言是公開的,如果生硬的加上Session,有些麻煩。但這個(gè)服務(wù)我只希望我自己的ajax能訪問,不希望別人發(fā)現(xiàn)并調(diào)用,但原來的xml web service架構(gòu)的確不能滿足這個(gè)需求。如果被一個(gè)攻擊者發(fā)現(xiàn),他可能會(huì)根據(jù)公開的wsdl開發(fā)客戶端,然后不停的DDOS攻擊,災(zāi)難!
上面這個(gè)問題對(duì)于原來的web service,我還是沒有好的解決方案,當(dāng)然不代表沒有解決方案。有朋友知道,勞煩指教。
但對(duì)于WCF架構(gòu),就充分考慮到上面這個(gè)問題了。看看下面老的Xml Web Service架構(gòu)與WCF架構(gòu)之間的對(duì)比:
1) 老架構(gòu)
2) 新架構(gòu)
區(qū)別很明顯,老架構(gòu)MEX與業(yè)務(wù)耦合度非常高,儼然一體,而新的架構(gòu)卻將兩者份將開來,分而不僵,反而會(huì)增加靈活性。如果是WCF開發(fā)的服務(wù),在發(fā)布網(wǎng)站的時(shí)候,完全可以通過配置,將MEX終結(jié)點(diǎn)去掉,這樣就可以解決上面的問題。具體實(shí)例下文討論,有點(diǎn)困了,睡!
附上示例項(xiàng)目:
/Files/jillzhang/AjaxWs.rar
如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇