2012-08-09 51 views
0

我目前正在開發服務,其中客戶端通過發送帶有消息的xml文件與服務器進行通信。爲了提高消息傳遞的可靠性(客戶端將使用低質量的有限頻帶交換移動互聯網),我將這些消息分成64或128 Kb大小的小部分,並在BasicHttp綁定中以「流式傳輸」方式發送。WCF:WS-Dual綁定或basichttp綁定到大塊流文件

現在,我有一個問題: 服務器應該報告客戶端,如果他成功地獲得了一塊與否,所以經過FE 5塊未能傳遞,傳遞過程將被取消並推遲稍後嘗試,並跟蹤哪些塊被接收,哪些不是。

我在考慮使用回調機制來傳遞客戶端,因此服務器會在它的[OperationContract]中調用回調方法ChunkReceived,當它將塊保存到服務器端的文件中時,但是,如果我是錯誤,但回調僅適用於WS Dual http綁定,並且在basichttp綁定中不受支持。但流式傳輸在WS Dual綁定中不受支持。

因此,它是好的,我切換到WS雙結合,並使用傳輸=「緩衝」(考慮塊大小是相對較小) - 將不轉讓疼可靠性?或者,也許我能以某種方式與客戶端基本的HTTP綁定溝通,也許通過返回某種響應消息,即

[OperationContract] 
    ServerResponse SendChunk (Chunk chunk); 

其中ServerResponse將舉行一些枚舉或布爾標誌來告訴客戶,如果SendChunk操作就可以了。但是,我將不得不在客戶端和服務器端保留某種類型的數組,以跟蹤所有的塊狀態。我只是不確定在那裏使用什麼樣的最佳模式。任何建議將不勝感激。

回答

1

我們的應用程序存在類似的問題 - 低帶寬和許多斷開/超時。我們有更小的消息,所以我們沒有分割它們,但解決方案也應該適用於塊。我們在客戶端創建了Repeater。這被證明是可靠的解決方案 - 它適用於連接速度較慢,連接不良的客戶(如GPRS - 常常斷開連接)。如果服務器由於高負載而減速,客戶端也不會收到超時錯誤。下面是修改後的版本,以塊

客戶:

1. Client sends Chunk#1, with pretty short timeout time 

2. Is there OK response: 

    2A. Yes - proceed to next chunk 

     3. Was that last chunk? 

      3A. Yes - process reponse 

      3B. No - send next chunk 

    2B. No - repeat current chunk 

服務器:

  1. 接受請求

  2. 是大塊重複

    2A。是:

    1. 是最後一塊:

      3A。是 - 檢查響應是否準備就緒,否則等待(這可以使客戶端重複)

      3B。否 - 發送Ok回覆

    2B。編號:

    1. 保存要求的地方(列表,字典等)

    2. 這是最後一塊:

      5A。是 - 處理消息,保存響應,並將其發送到客戶端

      5B。否 - 發送OK消息

+0

謝謝你的算法,但如何結合的問題/轉一部分? – 2012-08-10 02:40:32