2012-09-05 50 views
1

我有一個有趣的問題,我需要解決,我不知道哪裏可以開始。我正在編寫一個MVC Web應用程序,通過表單獲取記錄列表,併爲每個應用程序創建一個ajax調用。 ajax調用的控制器使用的資源一次只能處理一個請求。簡單的解決方案是將ajax調用更改爲同步,但是,這會掛起瀏覽器並導致糟糕的體驗。隊列請求MVC控制器

此外,多個用戶可能會同時使用此應用程序,因此客戶端的排隊不起作用。

任何人有任何建議嗎?

邁克

+1

您是否考慮將控制器更改爲異步? –

+0

我沒有。這是我的理解,一個異步控制器不會幫助我。這不是這種情況嗎? – mcottingham

+0

我想這取決於這裏定義的資源:'使用一次只能處理一個請求的資源'。你能否更多地瞭解爲什麼一次只能處理一個,或者它是什麼類型的資源? –

回答

0

好第一關,我的要求是不太一樣的你。我的問題是我的後端數據庫往往有點慢,用戶的響應速度非常重要。

因此,我不得不從等式中刪除數據庫交互。

我的解決方案有兩個主要部分:

  1. 保持數據的服務器端緩存

  2. 創建一個單獨的進程中包含的所有數據庫的工作,可以與服務器

互動

單獨的進程是作爲由Windows服務託管的命名管道WCF服務實現的。

的基本過程的概述是:

  1. 用戶點擊「保存」,阿賈克斯張貼形式向一個MVC控制器
  2. 控制器更新緩存中的數據,然後調用WCF管
  3. 服務將數據推入併發隊列(以及會話ID),並返回一個guid令牌
  4. 控制器將令牌作爲JSON響應返回。
  5. jQuery Ajax處理程序攔截響應並將該令牌保存到一個UI元素中,該UI元素表示「已保存」表單。

服務本身是這樣的:

  1. 在開始創建一個定時器。
  2. 定時器打勾:
  3. 停止定時器。
  4. 從併發隊列
  5. 刪除所有排隊的工作項目發送的每個項目由工作處理器
  6. 要處理的項目添加到「已完成」,或「有錯誤」併發字典,由早期的鍵控會話ID(以及一些時間保持東西以消除陳舊的數據)。這包括原始工作令牌。
  7. 再次啓動計時器。

回到用戶的土地,有一個JavaScript的setInterval環運行:

  1. Ajax請求到服務器(心跳控制器)
  2. 控制器連接到服務,並將當前的會話ID
  3. 該服務從「完成」和「錯誤」的字典
  4. 控制器返回列表作爲JSON對象陣列返回的所有項目
  5. 通返回列表的javascript循環和使用代幣做適當的UI更新

最終的結果是,儘管緩慢的後端服務器持續一個非常敏感的用戶界面。

如果您希望實現代碼的任何特定部分讓我知道。

+0

謝謝!這絕對有幫助。我想我聽到的是,這不會是我應該在我的Web應用程序中做的事情。我需要有一個外部服務來排隊和執行。 – mcottingham