2016-04-14 63 views
3

我有一個運行在負載平衡器後面的ASP.NET Web API應用程序。某些客戶端保持HTTP繁忙連接時間過長,造成不必要的關聯並導致某些服務器實例負載過重。爲了解決這個問題,我希望在短時間內優雅地關閉一個正在做太多請求的連接(從而迫使客戶重新連接並選擇一個不同的服務器實例),同時保持低流量連接無限期地活動。因此我不能使用靜態配置。ASP MVC:我可以以編程方式刪除客戶端連接嗎?

是否有一些API可以調用來標記請求以「回答此問題然後關閉連接」?或者我可以簡單地添加ASP.NET將看到的Connection: close HTTP標頭併爲我關閉連接?

+0

我很想知道如何告訴請求來自同一個HTTP連接? – David

+0

好問題。我希望能得到答案! – fernacolo

+1

@David你一定可以知道他們來自哪個IP地址,但是可能的話,如果你有來自同一家公司的100個用戶,那麼他們都是相同的IP地址,你將全部放棄。 – Neil

回答

2

它看起來像你的情況的良好解決方案將是內置IIS功能稱爲Dynamic IP restriction。 「爲了提供這種保護,該模塊會暫時阻止HTTP客戶端的IP地址,這些客戶端會造成併發請求的數量異常高,或者在很短的時間內發出大量請求。」

它是通過Azure的Web應用程序的支持: https://azure.microsoft.com/en-us/blog/confirming-dynamic-ip-address-restrictions-in-windows-azure-web-sites/


如果是這樣的答案,請把它標記爲一個有益的或者其標記爲答案。謝謝!

+0

謝謝,但不起作用。這將阻止該實例上的IP地址並返回錯誤,如401或403。我想返回200並關閉連接,強制客戶端重新連接。 – fernacolo

+0

抱歉,延遲。我做了一些研究,並詢問隊友是否做了這樣的事情,我需要說我沒有找到現成的解決方案。有https://github.com/stefanprodan/WebApiThrottle,我認爲它可以在你的情況下部分使用,並實現節流邏輯,不會導致阻塞,而是返回你想要的。抱歉,無法提供幫助:-( –

1

我不是100%確定這會適用於您的情況,但過去我不得不阻止來自特定IP地址的人員和來自常見代理的人員。我創建了以下授權屬性類:

http://www.asp.net/web-api/overview/security/authentication-filters

在將轉儲的人基於由返回HttpStatusCode.BadRequest他們的IP地址。在每個請求中,您都必須檢查數據庫中的壞ips列表,然後從那裏進行查找。也許你可以處理剩下的客戶端,因爲他們會得到很多錯誤。

+0

謝謝,但我不關心客戶端IP地址,我只是想阻止客戶端鎖定服務器中的實例。 – fernacolo

1

編寫一個action filter,它返回302封鎖的IP地址的響應。我希望客戶端可以關閉當前的連接並重新嘗試新的位置(這可能與原始請求的URL相同)。

+0

謝謝,但返回302是一個破在REST接口中進行更改我想在發送響應之後關閉連接,並且僅在來自該連接(而不是IP地址)的給定數量的請求之後關閉連接 – fernacolo

+0

爲什麼要返回302重大更改?它應該是透明的客戶端。 – Neil

相關問題