[WSE]Web Service—后臺偵聽服務(wù)通過WSE2.0建立訂閱/發(fā)布關(guān)系
2024-07-21 02:21:26
供稿:網(wǎng)友
由于web service的執(zhí)行身份受限,所以我們無法直接讓web service申請作為一個soapreceiver,而是通過下面的web.config定義來制定本虛擬目錄的.ashx終結(jié)點,從而通過ws_addressing和ws_messaging機制來完成與后臺偵聽服務(wù)之間的訂閱/發(fā)布機制。
<configuration>
<configsections>
<section name="microsoft.web.services"
type="microsoft.web.services.configuration.webservicesconfiguration,
microsoft.web.services, version=2.0.0.0, culture=neutral,
publickeytoken=31bf3856ad364e35" />
</configsections>
原理介紹:
除了進程內(nèi)與 tcp 通訊機制,還可以在 asp.net 中將 soapreceivers 與 http 管道進行集成。如果查看一下 soapreceiver 的定義,您會注意到它實現(xiàn)了 ihttphandler:
public abstract class soapreceiver : soapport, ihttphandler
{
。。。
}
由于這一點,任何 soapreceiver 或 sendservice 類現(xiàn)在都能夠在 asp.net 中配置為 http 處理程序。通過在 web.config 文件的 httphandlers 部分添加一個新的映射,用戶能夠配置 http 處理程序。web.config 項將把 verb/path 組合映射到 soapreceiver 類型:
<system.web>
<httphandlers>
<!-- 為了讓我們的webservice能夠接收到來自于后臺偵聽服務(wù)的soap消息
我們讓webservice繼承自soapreceiver,并實現(xiàn)了void receive(soapenvelope envelope),
這樣dll通過向
new uri("http://"+ system.net.dns.gethostname() + "/myservice/getreceiver.ashx")
發(fā)送soap消息,那么soapreceiver的receive回調(diào)函數(shù)將被調(diào)用
-->
<add type="mywebservice.myinterface" path="getreceiver.ashx" verb="*" />
</httphandlers>
把這組代碼放到適當(dāng)?shù)奈恢茫瑢⑨槍γ織l輸入此虛擬目錄并指向 getreceiver.ashx 的消息而調(diào)用 myservice。現(xiàn)在我們不必擔(dān)心通過調(diào)用 soapreceiver.add 來配置 soapreceiver/soapservice,因為 asp.net 本質(zhì)上代替您完成了此任務(wù)。
如果更新客戶端以把消息發(fā)送到 http 終結(jié)點 (http://localhost/myservice/getreceiver.ashx),它會與使用 tcp 的工作方式相同,只是現(xiàn)在它通過 http 進行通訊。
web service—后臺偵聽服務(wù)訂閱關(guān)系
由于web service運行的身份是asp.net用戶,而soapreceiver.add方法對執(zhí)行權(quán)限要求較高,所以我們采用http終結(jié)點的方式,再加上幾個靜態(tài)的哈希表,從而完成了與后臺偵聽服務(wù)之間的異步交互,以及與客戶端調(diào)用者之間的異步交互。
下面我們具體講解一下:
首先,調(diào)用者請求web serviced的beginxxx方法,這個方法再異步調(diào)用processxxx方法它負責(zé)組裝出一個soapenvelope,并向uri為
soap.tcp://hostname:port/yourreceivername
的目標(biāo)endpoint,用soapsender.send發(fā)送這個soapenvelope。一方面用于通知訂閱關(guān)系,另一方面?zhèn)鬟f了各項參數(shù),以及預(yù)先生成的guid。之后就將處理權(quán)返回調(diào)用者。
這里包含了圖中的1,2,3三步:
其次,正在監(jiān)聽的偵聽服務(wù)收到了消息,進行處理:
添加這個訂閱者的各種信息到靜態(tài)哈希表;
利用i/o完成端口異步執(zhí)行各種任務(wù);
把結(jié)果集或者錯誤信息通過web service http終結(jié)點通知訂閱者。
這里包含了圖中的4,5,6三步:
最后,訂閱者web service收到通知后,通知客戶端調(diào)用者的回調(diào)函數(shù)來取回結(jié)果集,從而將結(jié)果集或者錯誤原因返回給客戶端。
編寫者:鄭昀@ultrapower