2010-08-09 51 views
1

我希望能夠優先處理來自WCF服務的傳出數據/消息。如何優先使用WCF傳出消息

這裏的基本情況:從服務器

  1. 客戶端請求的數據流。數據流是實時的,很大的,並且可能是無休止的(設備監控數據)。我們將調用這個HighPriorityDataStream。
  2. 客戶端請求附加數據。我們將稱之爲LowPriorityData。

帶寬是有限的(認爲撥號調制解調器或衛星)。當請求LowPriorityData時,當前HigPriorityDataStream不被中斷或延遲是非常重要的。

我已經有一個基於套接字的遺留系統,這是通過手動控制數據放入套接字緩衝區的順序來完成的。高優先級數據放在緩衝區中,如果剩餘空間,則添加較低優先級的數據以填充緩衝區的其餘部分。

我試圖重新設計這個過程與WCF ...我不知道任何現成的解決方案,並認爲我可能需要編寫自定義渠道的行爲,但我想在我去那條路線之前選擇社區的大腦:)

回答

0

很多閒逛(感謝拉吉斯拉夫您周到的想法)後,我來,我要問的通信層,解決了樓內設有商務層問題的結論。爲了更好地說明問題,有多個連接和一個數據源。數據源必須優先處理從自己的數據源(實時數據流和持久數據庫)中收集哪些數據,並根據數據源的優先級將數據發送回各種客戶端。要清楚的是,客戶端基於其基於角色的身份具有相對優先級,數據源具有優先級(偏好實時數據而不是持久數據)並且數據源中的單個字段具有優先級順序(其他都相同,字段必須始終在字段Y之前發送X)。

這就是我們採用的所有業務邏輯和解決方案,作爲一組優先級隊列,根據這些優先級要​​求自動對輸入數據項進行排序,然後按照該順序處理每個請求。

0

我認爲沒有一般的現成解決方案。該解決方案取決於您的其他要求。您想要控制每個客戶端還是整個服務器(所有客戶端)的帶寬?你想從同一個代理調用低優先級操作,還是爲新操作啓動新代理?你想同時運行更高優先級的操作嗎?你想優先考慮請求?

最簡單的解決方案要求您控制每個客戶端的帶寬,對所有調用重複使用相同的代理,同時只能完成一個高優先級操作,並按FIFO順序處理請求。您只需使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single)]標記您的服務實現(這應該是通過NET.TCP公開的服務的默認設置)。此設置將重複使用來自同一客戶端代理的所有呼叫的相同服務實例,但只有一個呼叫將在時間處理(其他人將在隊列中等待,直到它們被處理或時間消耗)。

最好的問候,拉吉斯拉夫·