[WSE]Web Service—後台偵聽服務通過WSE2.0建立訂閱/發佈關係 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- [WSE]Web Service—後台偵聽服務通過WSE2.0建立訂閱/發佈關係 (http://www.webasp.net/article/18/17656.htm) |
| -- 作者:未知 -- 發佈日期: 2005-04-19 |
| 由於Web Service的執行身份受限,所以我們無法直接讓Web Service申請作為一個SoapReceiver,而是通過下面的web.config定義來制定本虛擬目錄的.ashx終結點,從而通過WS_Addressing和WS_Messaging機制來完成與後台偵聽服務之間的訂閱/發佈機制。
<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> 原理介紹: 除了進程內與 TCP 通訊機制,還可以在 ASP.NET 中將 SoapReceivers 與 HTTP 管道進行集成。如果查看一下 SoapReceiver 的定義,您會注意到它實現了 IhttpHandler: public abstract class SoapReceiver : SoapPort, IHttpHandler { 。。。 } 由於這一點,任何 SoapReceiver 或 SendService 類現在都能夠在 ASP.NET 中配置為 HTTP 處理程序。通過在 web.config 文件的 httpHandlers 部分添加一個新的映射,用戶能夠配置 http 處理程序。web.config 項將把 verb/path 組合映射到 SoapReceiver 類型: <system.web> <httpHandlers> <!-- 為了讓我們的WebService能夠接收到來自於後台偵聽服務的SOAP消息 我們讓WebService繼承自SoapReceiver,並實現了void Receive(SoapEnvelope envelope), 這樣DLL通過向 new Uri("http://"+ System.Net.Dns.GetHostName() + "/MyService/GetReceiver.ashx") 發送SOAP消息,那麼SoapReceiver的Receive回調函數將被調用 --> <add type="MyWebService.MyInterface" path="GetReceiver.ashx" verb="*" /> </httpHandlers> 把這組代碼放到適當的位置,將針對每條輸入此虛擬目錄並指向 GetReceiver.ashx 的消息而調用 MyService。現在我們不必擔心通過調用 SoapReceiver.Add 來配置 SoapReceiver/SoapService,因為 ASP.NET 本質上代替您完成了此任務。 如果更新客戶端以把消息發送到 HTTP 終結點 (http://localhost/MyService/GetReceiver.ashx),它會與使用 TCP 的工作方式相同,只是現在它通過 HTTP 進行通訊。 Web Service—後台偵聽服務訂閱關係 由於Web Service運行的身份是ASP.NET用戶,而SoapReceiver.Add方法對執行權限要求較高,所以我們採用HTTP終結點的方式,再加上幾個靜態的哈希表,從而完成了與後台偵聽服務之間的異步交互,以及與客戶端調用者之間的異步交互。 下面我們具體講解一下: 首先,調用者請求Web Serviced的BeginXXX方法,這個方法再異步調用ProcessXXX方法它負責組裝出一個SoapEnvelope,並向Uri為 soap.tcp://hostname:port/yourreceivername 的目標EndPoint,用SoapSender.Send發送這個SoapEnvelope。一方面用於通知訂閱關係,另一方面傳遞了各項參數,以及預先生成的GUID。之後就將處理權返回調用者。 這裡包含了圖中的1,2,3三步: 其次,正在監聽的偵聽服務收到了消息,進行處理: 添加這個訂閱者的各種信息到靜態哈希表; 利用I/O完成端口異步執行各種任務; 把結果集或者錯誤信息通過Web Service HTTP終結點通知訂閱者。 這裡包含了圖中的4,5,6三步: 最後,訂閱者Web Service收到通知後,通知客戶端調用者的回調函數來取回結果集,從而將結果集或者錯誤原因返回給客戶端。 編寫者:鄭昀@UltraPower |
| webasp.net |