在ASP.NET?MVC下限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)的解決方法
在ASP.NET MVC下限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)
有時(shí)候,當(dāng)用戶請(qǐng)求一個(gè)Controller下的Action,我們希望,在單位時(shí)間間隔內(nèi),比如每秒,每分鐘,每小時(shí),每天,每星期,限制同一個(gè)IP地址對(duì)某個(gè)Action的請(qǐng)求次數(shù)。如何做呢?
stefanprodan的MvcThrottle能很好地解決這個(gè)問(wèn)題,以及其它類(lèi)型的IP限制問(wèn)題。在這里:GitHub - stefanprodan/MvcThrottle: ASP.NET MVC Throttling filter
把項(xiàng)目從GitHub下載下來(lái),在本地打開(kāi)。
找到MvcThrottle類(lèi)庫(kù),打開(kāi)ThrottlingFilter這個(gè)類(lèi),在該類(lèi)的OnActionExecuting方法中修改如下:
//check if limit is reached if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit) { //log blocked request if (Logger != null) Logger.Log(ComputeLogEntry(requestId, identity, throttleCounter, rateLimitPeriod.ToString(), rateLimit, filterContext.HttpContext.Request)); //break execution and return 409 var message = string.IsNullOrEmpty(QuotaExceededMessage) ? "HTTP request quota exceeded! maximum admitted {0} per {1}" : QuotaExceededMessage; //add status code and retry after x seconds to response filterContext.HttpContext.Response.StatusCode = (int)QuotaExceededResponseCode; filterContext.HttpContext.Response.Headers.Set("Retry-After", RetryAfterFrom(throttleCounter.Timestamp, rateLimitPeriod)); filterContext.Result = QuotaExceededResult( filterContext.RequestContext, string.Format(message, rateLimit, rateLimitPeriod), QuotaExceededResponseCode, requestId); return; }
把以上替換成
//check if limit is reached if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit) { filterContext.HttpContext.Response.Redirect("/Error.html"); return; }
讓其在超過(guò)次數(shù)時(shí),跳轉(zhuǎn)到項(xiàng)目根目錄下的Error.html文件。
生成該類(lèi)庫(kù),類(lèi)庫(kù)MvcThrottle.dll生成在類(lèi)庫(kù)的bin/Debug文件夾下。
在ASP.NET MVC 4 下創(chuàng)建一個(gè)項(xiàng)目。
在項(xiàng)目根目錄下創(chuàng)建一個(gè)Library文件夾,把剛才的MvcThrottle.dll拷貝其中。
引用Library文件夾下的MvcThrottle.dll組件。
在App_Start文件夾中,修改FilterConfig類(lèi)如下:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { var throttleFilter = new ThrottlingFilter { Policy = new ThrottlePolicy(perSecond: 1, perMinute: 10, perHour: 60 * 10, perDay: 600 * 10) { IpThrottling = true }, Repository = new CacheRepository() }; filters.Add(throttleFilter); } }
創(chuàng)建HomeController,編寫(xiě)如下:
public class HomeController : Controller { public ActionResult Index() { return View(); } [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)] public ActionResult Other() { return View(); } [HttpPost] [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)] public ActionResult GetSth() { return Json(new {msg=true}); } }
生成解決方案。
報(bào)錯(cuò)了!What Happened?
原來(lái)MvcThrottle是ASP.NET MVC 5下開(kāi)發(fā)的。
有辦法。重新打開(kāi)MvcThrottle項(xiàng)目的類(lèi)庫(kù),在引用中刪除原來(lái)的System.Web.Mvc,重新引用本地ASP.NET MVC4版本,重新引用本地的System.Web.Mvc。
重新生成類(lèi)庫(kù),重新拷貝到Library文件夾下,成功生成解決方案。
在Home/Index.cshtml視圖中:
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Index</h2> <input type="button" id="btn" value="請(qǐng)求"/> @section scripts { <script type="text/javascript"> $(function() { $('#btn').on("click", function() { $.post('@Url.Action("GetSth")',function(data) { if (data.msg) { alert("請(qǐng)求成功一次"); } else { alert("請(qǐng)求次數(shù)過(guò)多"); } }); }); }); </script> }
當(dāng)在單位時(shí)間間隔內(nèi)超過(guò)規(guī)定次數(shù),就彈出"請(qǐng)求次數(shù)過(guò)多"提示框。
在Home/Other.cshtml視圖中:
@{ ViewBag.Title = "Other"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Other</h2>
當(dāng)在單位時(shí)間間隔內(nèi)超過(guò)規(guī)定次數(shù),就跳轉(zhuǎn)到預(yù)定的Error.html頁(yè)了。
到此這篇關(guān)于在ASP.NET MVC下限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)的解決方法的文章就介紹到這了,更多相關(guān)ASP.NET MVC請(qǐng)求次數(shù)限制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net 讀取Excel數(shù)據(jù)到DataTable的代碼
asp.net 讀取Excel數(shù)據(jù)到DataTable的代碼,需要的朋友可以參考下。2010-03-03.NET醫(yī)院公眾號(hào)系統(tǒng)線程CPU雙高問(wèn)題分析
這篇文章主要介紹了.NET醫(yī)院公眾號(hào)系統(tǒng) 線程CPU雙高分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04.Net使用Cancellation?Framework取消并行任務(wù)
這篇文章介紹了.Net使用Cancellation?Framework取消并行任務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06輕量級(jí)ORM框架Dapper應(yīng)用之實(shí)現(xiàn)In操作
這篇文章介紹了使用Dapper實(shí)現(xiàn)In操作的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03.NET連接數(shù)據(jù)庫(kù)以及基本的增刪改查操作教程
這篇文章主要給大家介紹了關(guān)于.NET連接數(shù)據(jù)庫(kù)以及基本的增刪改查操作教程的相關(guān)資料,對(duì)于剛?cè)腴T(mén)的新手們來(lái)說(shuō)是個(gè)很好的入門(mén)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Asp.net 2.0 無(wú)刷新圖片上傳 顯示縮略圖 具體實(shí)現(xiàn)
簡(jiǎn)單三步實(shí)現(xiàn)圖片無(wú)刷新上傳:注意是上傳,至于上傳時(shí)的驗(yàn)證,比如圖片的尺寸,大小,格式。自行解決。如果我搞定了,也會(huì)貼上來(lái)的。2013-06-06