簡體   English   中英

使用WCF實現觀察者模式

[英]Implementing observer pattern using WCF

當我第一次發布這個問題時,我在Web服務和應用程序控制器之間建立了牢固的耦合,其中控制器需要打開服務的多個線程,並且當它接收回數據時,它必須對返回的數據進行大量處理並將其合並為一個數據集。 我不喜歡這樣的事實,客戶端在准備好使用之前必須進行大量處理並合並返回的數據,並希望將該層移至服務並讓該服務向供應商打開異步線程並合並結果在將它們返回給客戶之前。

我面臨的一個挑戰是,我迫不及待要等到所有線程完成並合並結果之后,才能開始接收可用的數據。 這就要求我在服務上實現觀察者模式,以便在合並新結果集並准備使用它們時將通知我的應用程序,並將其發送到應用程序。

我一直在尋找如何在ASMX webservices或WCF上執行此操作,到目前為止,我已經找到了使用WCF進行實現的方法,但是此線程始終開放,可以提出建議和進行改進。

好的,我的問題的解決方案來自WCF

除了ASMX Web服務的經典請求-應答操作外,WCF還支持其他操作類型,例如; 單向呼叫,雙工回調和流式傳輸。

不太難猜測,我一直在尋找雙工回調。

雙工回調僅允許服務對客戶端進行回調。 服務器上定義了回調協定,並且要求客戶端在每次調用時提供回調端點。 然后由服務決定何時以及多少次使用回調引用。

僅具有雙向綁定的綁定支持回調操作。 WCF提供WSDualHttpBinding來支持HTTP上的回調(由於TCP和IPC協議支持雙工通信,因此NetNamedPipeBinding和NetTcpBinding也存在回調支持)

這里要注意的一件事很重要,那就是雙工回調是非標准的純Microsoft功能。 由於我的Web服務和應用程序都在Microsoft ASP.NET上運行,因此這不會對我當前的任務造成任何問題。

對WCF服務進行編程使我在WCF上有了一個良好的起點。 超過700頁,它深入探討了WCF的所有概念,並專門討論了回調和其他類型的操作。

我在網上發現的其他一些好資源是:

Windows Communication Foundation(WCF)屏幕錄像

MSDN網絡廣播:Windows Communication Foundation從上至下

網絡服務軟件工廠

WCF服務工廠

這聽起來像Windows Workflow Foundation的完美用例。 您可以輕松地創建工作流程以從每個供應商那里獲取信息,然后在准備就緒時合並結果。 它更加干凈,並且WF將為您完成所有異步工作。

我不太確定這里是否需要雙工... IMO,帶有回調的標准異步調用應該足以獲取數據傳遞的通知。

最大的問題是什么? 如果您在談論異步等,那么通常我們在談論將數據獲取到客戶端所花費的時間。 這是因為數據量龐大嗎? 還是在服務器上生成數據的復雜性?

如果是數據量,那么我可以想到多種顯着提高性能的方法-盡管大多數方法都涉及使用DTO對象(而不是問題似乎暗示的DataSet / DataTable )。 例如, protobuf-net大大減少了數據量和傳輸數據所需的處理。

一個實現這一目標的途徑之一是通過異步調用您的WS( http://www.stardeveloper.com/articles/display.html?article=2001121901&page=1http://www.ondotnet.com/pub/a/ dotnet / 2005/08/01 / async_webservices.html ),然后在回調中更新GUI。

但是,如果數據查詢花費的時間太長,則可能會出現超時問題。 例如,如果供應商的網站之一關閉或非常慢,則可能意味着整個查詢可能會失敗。 如果客戶端的業務邏輯執行合並而不是WS進行合並,則可能會更好。

不確定此解決方案是否適合您的特定任務,但是無論如何:

  1. 將分頁參數添加到您的WS API(int pageNumber,int pageSize,out in totaltals)
  2. 添加一個短暫的TTL緩存,該緩存將請求詳細信息(可能是哈希值)與輸出數據相關聯

當您的應用程序請求第一頁時,請在准備好第一頁時將其返回,然后將全部收集/合並的數據放入緩存中,以便在需要下一頁時可以使用已經准備好的內容。

但是請注意,您將無法獲取最新數據,請謹慎配置緩存重載間隔。

在您的方案和技術中,絕對最佳的存檔方法是在Web應用程序/庫之間針對Web服務添加某種令牌,並且您的控制器需要一個線程來檢查是否有新結果等。但是請注意,將需要從WS獲得完整的數據,因為合並可能會導致初始響應中的項目被刪除。

還是我仍然認為使用WCF Web服務從控制器處理線程會更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM