soap 路由
?
下面主要通過(guò)項(xiàng)目實(shí)例來(lái)具體闡述如何實(shí)現(xiàn)wse路由和一些項(xiàng)目開(kāi)發(fā)中的細(xì)節(jié)。本人水平有限,有不對(duì)的地方,請(qǐng)朋友們不吝賜教。
在開(kāi)始項(xiàng)目之前,先了解一下路由的概念,所謂"路由",是指把數(shù)據(jù)從一個(gè)地方傳送到另一個(gè)地方的行為和動(dòng)作,它通常包括兩種行為:選擇最佳路徑和通過(guò)網(wǎng)絡(luò)交換數(shù)據(jù)。我們平時(shí)使用的路由器就是為了此項(xiàng)功能而產(chǎn)生的機(jī)器。那么wse為何要具備路由的功能呢?這個(gè)必須是我們首先要弄明白的問(wèn)題。
對(duì)SOA不了解或者沒(méi)有相關(guān)開(kāi)發(fā)和運(yùn)維經(jīng)驗(yàn)的朋友可能體會(huì)不出wse為何要有路由功能的理由,從表面看來(lái),完全沒(méi)必要嘛!客戶端指定一個(gè)服務(wù)端,雙方交換數(shù)據(jù)就可以了!非也,在SOA中,要面對(duì)的往往是部門(mén)與部門(mén)之間,企業(yè)與企業(yè)之間,機(jī)構(gòu)與機(jī)構(gòu)之間的系統(tǒng)協(xié)作問(wèn)題,此時(shí)如果提供服務(wù)的一方出現(xiàn)維修問(wèn)題,會(huì)影響到很多客戶端,而這些客戶端可能分布在不同的個(gè)人或者機(jī)構(gòu)中,中間一些協(xié)調(diào)和溝通問(wèn)題會(huì)很快讓你進(jìn)入hell,而有些客戶端系統(tǒng)對(duì)于系統(tǒng)的穩(wěn)定性要求極高。所以如果服務(wù)端不做傷筋動(dòng)骨的改動(dòng),應(yīng)該盡最大可能保持客戶端的正常運(yùn)行。Wse的路由功能就是為了解決此類問(wèn)題的方案之一。一句話它能夠使服務(wù)端能夠在對(duì)服務(wù)進(jìn)行維護(hù)的時(shí)候,經(jīng)過(guò)簡(jiǎn)單的配置,改變soap消息的原有路由,從而保證客戶端的穩(wěn)定運(yùn)行。
要實(shí)現(xiàn)wse的路由功能,有兩種手段:第一是通過(guò)配置文件,這個(gè)配置文件在wse框架中被稱為referral cache.另外一種是基于soap消息內(nèi)容來(lái)實(shí)現(xiàn)。本文首先解決如何通過(guò)配置文件來(lái)實(shí)現(xiàn)wse路由。
- 通過(guò)配置來(lái)實(shí)現(xiàn)wse路由
實(shí)現(xiàn)wse路由,需要兩個(gè)大的步驟:
我們通過(guò)以下情景來(lái)實(shí)現(xiàn)項(xiàng)目演示:目前我們存在一個(gè)服務(wù),所在服務(wù)器為S1,因?yàn)槁酚蓪?duì)客戶端沒(méi)有影響,所以我們只模擬一個(gè)客戶端,服務(wù)器為C,我們目前的路由情況如下圖所示:
首先我們看一下使用了路由的網(wǎng)絡(luò)服務(wù),路由,和客戶端程序的特點(diǎn)。
網(wǎng)絡(luò)服務(wù):使用了路由的網(wǎng)絡(luò)服務(wù)必須接受來(lái)源于路由服務(wù)器R的請(qǐng)求,因此需指定網(wǎng)絡(luò)服務(wù)的SoapActor Attribute,為路由的URL或者接受所有的來(lái)源。有關(guān)SoapActor的描述如下:一個(gè)SOAP消息從始節(jié)點(diǎn)到終節(jié)點(diǎn)的過(guò)程中,可能沿著消息路徑經(jīng)過(guò)一系列SOAP中間節(jié)點(diǎn)。一個(gè)SOAP中間節(jié)點(diǎn)是一個(gè)可以接收轉(zhuǎn)發(fā)SOAP消息的應(yīng)用程序。中間節(jié)點(diǎn)和終節(jié)點(diǎn)由URI區(qū)分。可能SOAP消息的終節(jié)點(diǎn)并不需要所有部分,而在消息路徑上的一個(gè)和幾個(gè)中間節(jié)點(diǎn)可能需要這些內(nèi)容。頭元素的接收者扮演的角色類似于一個(gè)過(guò)濾器,防止這些只發(fā)給本接受者的消息部分?jǐn)U散到其它節(jié)點(diǎn)。即一個(gè)頭元素的接收者必須不轉(zhuǎn)發(fā)這些頭元素到SOAP消息路徑上的下一個(gè)應(yīng)用程序。同樣的,接收者可能插入一個(gè)相似的頭元素。SOAP actor全局屬性可以用于指示頭元素的接收者。SOAP actor屬性的值是一個(gè)URI。省略SOAP actor屬性表示接收者是SOAP消息的終節(jié)點(diǎn)
對(duì)網(wǎng)絡(luò)服務(wù)的創(chuàng)建和設(shè)計(jì)需要注意的地方如下圖:
??????
除了此處,網(wǎng)絡(luò)服務(wù)和其他的使用wse3.0的服務(wù),沒(méi)有區(qū)別。
再看一下路由,路由程序是一個(gè)非常特殊的程序,他可以沒(méi)有任何程序,只包含兩個(gè)配置文件,這里主要講述一下如何設(shè)置這兩個(gè)配置文件
這樣就添加了對(duì)Microsoft.Web.Services3的引用,需要注意的是,web.config中添加引用的部分必須類似如下
因?yàn)檫@個(gè)項(xiàng)目沒(méi)有bin目錄,當(dāng)然如果您打可sp1的補(bǔ)丁,添加引用后,bin目錄會(huì)有相關(guān)dll,是不需要如上圖所示的。我這里創(chuàng)建的是網(wǎng)站,所以必須如此,因?yàn)闆](méi)有這個(gè)網(wǎng)站將無(wú)法使用wse,也就無(wú)法實(shí)現(xiàn)路由的功能了。
對(duì)路由網(wǎng)站的設(shè)置還包括如下操作,它為web.config添加了一個(gè)HttpHandler,用于處理http請(qǐng)求,您可以自定義HttpHandler,也可以使用wse3.0默認(rèn)提供的Microsoft.Web.Services3.Messaging.SoapHttpRouter,添加方法如下:
??????????
點(diǎn)擊確定后
?????????
經(jīng)過(guò)上面的操作,會(huì)在web.config添加如下的代碼:
?????????
您也可以手動(dòng)添加。
??
下面說(shuō)明一下各個(gè)節(jié)點(diǎn)的意義:
<r:referrals>節(jié)點(diǎn)是根節(jié)點(diǎn)。在一個(gè)配置文件中有且只有一個(gè)。
<r:ref>節(jié)點(diǎn)用于標(biāo)識(shí)一個(gè)特定的路由配置,在一個(gè)配置文件中可有可無(wú),也可以是多個(gè)
<r:for>節(jié)點(diǎn)用于指示來(lái)源消息的部分信息
<r:exact>節(jié)點(diǎn)用于指定一個(gè)來(lái)源信息的詳細(xì)信息,一個(gè)<r:for>必須包含一個(gè)<r:exact>或者<r:prefix>
<r:if>節(jié)點(diǎn)指定路由的條件,一個(gè)<r:for>必須有一個(gè)<r:if>
<r:go>節(jié)點(diǎn)指示重定向的一些信息,一個(gè)<r:ref>一個(gè)<r:go>
<r:via>節(jié)點(diǎn)指示消息重定向到的url地址,一個(gè)<r:go>至少一個(gè)<r:via>
<r:refId>節(jié)點(diǎn)指示路由配置的唯一標(biāo)識(shí)
設(shè)置好referral cache后,需要做如下的設(shè)置:
點(diǎn)擊確定后,在web.config添加如下代碼:
?
部署路由站點(diǎn)的時(shí)候,一定要注意要對(duì)referral cache給網(wǎng)絡(luò)用戶(IIS6.0中是network service)設(shè)置文件寫(xiě)權(quán)限,這個(gè)是必須的,不要忘記。
?
對(duì)于客戶端而言,和其他客戶端沒(méi)有區(qū)別,只是將消息的發(fā)送地址設(shè)置為路由地址。設(shè)置方式如下:
此時(shí),啟動(dòng)客戶端程序,便可以出現(xiàn)如下圖所示的結(jié)果:
表明如第一張圖中所示的三個(gè)部分都已經(jīng)正常工作了。
下面模擬一下路由的優(yōu)點(diǎn),當(dāng)運(yùn)行網(wǎng)絡(luò)的服務(wù)器S1需要維修或者系統(tǒng)需要升級(jí)的時(shí)候,我們可以按照以下的步驟來(lái)進(jìn)行操作:
第一步:準(zhǔn)備好一個(gè)備用服務(wù)器S2,將S2上部署一個(gè)和S1上一樣的環(huán)境,并部署網(wǎng)絡(luò)服務(wù)程序。
第二步:準(zhǔn)備另外一個(gè)referral cache配置文件,將其中的<r:go>中的信息更改為S2上服務(wù)的Url地址。
第三部:用新的referral cache文件替換路由服務(wù)器R上的referral cache
經(jīng)過(guò)這三步,客戶端可以沒(méi)有任何的改動(dòng)和影響。消息可以照常發(fā)送,但實(shí)際的接收方已經(jīng)變?yōu)榱薙2.
運(yùn)行客戶端,我們有得到了我們期待的結(jié)果
限于條件所限,本文中在一臺(tái)機(jī)器中模擬客戶端,路由,和服務(wù)端,下載到本地的程序需要更改url才能運(yùn)行
??????? 還可以通過(guò)更改Soap消息內(nèi)容來(lái)實(shí)現(xiàn)此種功能,留作下一篇做闡述。
文章來(lái)自網(wǎng)絡(luò)轉(zhuǎn)載
轉(zhuǎn)載于:https://www.cnblogs.com/Struts-pring/p/4259870.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: poj 3104 Drying(二分查找
- 下一篇: C之printf()函数