亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Asp.netCore中使用Attribute來描述限流的操作步驟

 更新時間:2024年12月26日 09:26:19   作者:老九  
這篇文章主要介紹了在Asp.netCore中使用Attribute來描述限流的操作步驟,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧

前言

同事問我Asp.netCore的RateLimiting是怎么使用的,我回答說很簡單的,你只要按照如下步驟來:

  • 在RateLimiterOptions上注冊policy,記住policy對應的policyName
  • 在Web應用添加UseRateLimiter()中間件
  • 在api對應的Action上標注[EnableRateLimiting(policyName)]

半小時后,同事說要對我告知他的RateLimiter功能差評,因為他得寫幾十種policy工作量很大,就連policyName的取名都讓他頭大。

讓RateLimiting更簡單

我在基于Yarp的網(wǎng)關上做過RateLimiting,將每個服務的所有Endpoint描述導出放到網(wǎng)關做網(wǎng)關的子級路由,然后基于Endpoint做可配置化的限流,代碼實現(xiàn)上很復雜但使用靈活度非??捎^。
但今天我們的問題范圍是在單體WebApplication中,如何減少我同事的限流工作量。

限流器Attribute化

假如我們造了如下的Attribute:

  • [RateLimiter.Concurrency(permitLimit: 10)]
  • [RateLimiter.FixedWindow(permitLimit: 10, windowSeconds: 60)]
  • [RateLimiter.SlidingWindow(permitLimit: 10, windowSeconds: 60, segmentsPerWindow: 5)]

讓我的同事在Action上標記其中一個Attribute,他的開發(fā)時間短、代碼可讀性高,免去了他手寫policy實現(xiàn)的巨量代碼。

限流單元來源Attribute化

同事說他的眾多接口中,需要整體限流的很少,幾乎都是需要顆粒度更細的限流:

  • 登錄接口,需要對請求體的json對象的userName值做限流單元
  • 找回密碼接口,需要對請求路由里的userName值做限流單元
  • 其它已經(jīng)做了用戶身份認證的接口,需要用userId值做限流單元
  • xx特殊接口,需要用請求者IP值做限流單元
  • yy接口需要從Form中取出yy值做限流單元
  • zz接口需要從Header中取出zz值做限流單元
  • 想自定義從HttpContext里獲取限流單元

于是我們又造了一些Attribute,來處理上面的需求

  • [RateLimiterUnit.FromBody(unitName: "$.userName")]
  • [RateLimiterUnit.FromRoute(unitName: "userName")]
  • [RateLimiterUnit.FromUser(unitName: ClaimTypes.NameIdentifier)]
  • [RateLimiterUnit.FromRemoteIPAddress]
  • [RateLimiterUnit.FromForm(unitName: "yy")]
  • [RateLimiterUnit.FromHeader(unitName: "zz")]

再提供一個IRateLimiterUnitMetadata接口,讓他實現(xiàn)自定義邏輯

public class YourRateLimiterUnitAttribute : Attribute, IRateLimiterUnitMetadata
{
    public ValueTask<string?> GetUnitAsync(HttpContext context)
    {
        throw new NotImplementedException();
    }
}

讓RateLimiting能運行

上面提到的那些Attribute,目前只存在于我們理想中,我們需要把它變成實際。

我們需要實現(xiàn)實現(xiàn)一個policy,在policy里獲取當前請求的Endpoint,從Endpoint的metadata里提取出我們上面定義的Attribute,根據(jù)Attribute的描述生成RateLimitPartition。

把這個唯一的policy注冊到RatelimiterOptions中,再把它的policyName使用EnableRateLimitingAttribute添加到Endpoint的metadata中。

最后,使用標準的Asp.netCore的UseRateLimiter()中間件,就能把我們的限流器運行起來了。

最后

此項目是開源的,不管你在工作中有沒有用到,但里面有意思的想法你可以來一起品。

到此這篇關于在Asp.netCore中使用Attribute來描述限流的文章就介紹到這了,更多相關Asp.netCore Attribute限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • asp.net中日歷函數(shù)Calendar的使用方法

    asp.net中日歷函數(shù)Calendar的使用方法

    calendar 控件用于在瀏覽器中顯示日歷,該控件可顯示某個月的日歷,允許用戶選擇日期,也可以跳到前一個或下一個月
    2011-05-05
  • ASP.NET?Core?MVC中的標簽助手(TagHelper)用法

    ASP.NET?Core?MVC中的標簽助手(TagHelper)用法

    這篇文章介紹了ASP.NET?Core?MVC中標簽助手(TagHelper)的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • asp.net 上傳或下載當文件名包含有特殊字符"#"的處理

    asp.net 上傳或下載當文件名包含有特殊字符"#"的處理

    在上傳或下載文件時,當文件名包含有"#"特殊字符時,上傳以后的文件會被改名字,造成下載也下載不了。
    2010-03-03
  • ASP.NET Core中的Controller使用示例

    ASP.NET Core中的Controller使用示例

    這篇文章主要介紹了ASP.NET Core中的Controller使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • asp.net“服務器應用程序不可用” 解決方法

    asp.net“服務器應用程序不可用” 解決方法

    服務器應用程序不可用 您試圖在此 Web 服務器上訪問的 Web 應用程序當前不可用。請點擊 Web 瀏覽器中的“刷新”按鈕重試您的請求。 管理員注意事項: 詳述此特定請求失敗原因的錯誤消息可在 Web 服務器的系統(tǒng)事件日志中找到。請檢查此日志項以查明導致該錯誤發(fā)生的原因。
    2008-10-10
  • asp.net利用cookie保存用戶密碼實現(xiàn)自動登錄的方法

    asp.net利用cookie保存用戶密碼實現(xiàn)自動登錄的方法

    這篇文章主要介紹了asp.net利用cookie保存用戶密碼實現(xiàn)自動登錄的方法,實例分析了asp.net針對cookie的創(chuàng)建、提取與銷毀操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • VS2013的Browser Link引起的問題

    VS2013的Browser Link引起的問題

    這篇文章主要為大家詳細介紹了VS2013的Browser Link引起的問題,以及Browser Link問題的解決方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • .NET Core實現(xiàn)企業(yè)微信獲取部門成員

    .NET Core實現(xiàn)企業(yè)微信獲取部門成員

    這篇文章介紹了.NET Core實現(xiàn)企業(yè)微信獲取部門成員的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • asp.net?core?中的Jwt(Json?Web?Token)的使用詳解

    asp.net?core?中的Jwt(Json?Web?Token)的使用詳解

    session不支持分布式并且在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給我們的應用,這篇文章主要介紹了asp.net?core?中的Jwt(Json?Web?Token)的使用,需要的朋友可以參考下
    2022-10-10
  • Could not load file or assembly "App_Licenses.dll"的問題

    Could not load file or assembly "App_Licenses.dll"

    Could not load file or assembly "App_Licenses.dll"的問題
    2010-03-03

最新評論