2015-07-20 50 views
0

我們有一個c#.net Web API服務調用代碼,它無法一次處理多個數據庫請求。該系統用於在線支付相對較小需求的賬單。使.net web api隊列請求操作'單線程'

我們沒有對代碼進行控制以進行修改問題的更改。另一個使用相同代碼的組使用WCF API和服務配置將併發請求限制爲1,從而有效地解決了這個問題。我們現在必須在WCF中重寫或者弄清楚如何使Web API工作。

有沒有辦法讓Web API排隊處理請求並逐個處理它們,同時仍然爲最終用戶保持「實時」操作?

對不起,如果這是模糊的,我代表實際的程序員請求幫助。

+0

你是什麼意思是「仍然保持工作」實時''?你正在處理同步應用程序嗎?['']有一個'maxConcurrentRequestsPerCPU'設置(https://msdn.microsoft.com/en-us/library/dd560842(v = vs.110) .aspx)可能會達成協議。 –

回答

0

我知道的唯一方法就是「自己動手」。 I.E. :

  • 招你在哪裏服務請求到一些共享組件(如果你沒有像這樣的話)
  • 使表中永久存儲部分(DB,雲...)對於排隊操作,在那裏存儲傳入的請求(應該很容易實現,因爲請求必須以某種方式可序列化 - 我會選擇xml作爲持久存儲)
  • 更改您的服務,而不是處理請求,它只會驗證請求&將請求存儲到永久存儲器(db)中並返回
  • 創建用於處理請求的新程序集asynchr將在獲取時間從持久性存儲(DB)的要求之一,對它們進行處理並記錄故障

另外,您可以更改服務onously(通常是窗口服務,如果你使用的是Windows基礎設施)用火&忘記模式以「鎖定」語句來限制訪問支付部分 - 這樣的:

private static object s_SyncRoot = new object(); 

... 
new Task(() => 
{ 
    lock (s_SyncRoot) 
    { 
    // process payment - single thread 
    } 
}).Start(); 
return "ok"; 
... 

這是快速&容易實現 - 但是你犧牲可靠性比特 - 例如參見Fire and Forget with ASP.NET MVC。此外,它不能很好地擴展(如果將會看到請求&你會打開太多的並行線程,它可以有效地降低你的API服務