如何在应用程序启动时创建一个 Semaphoreslim 实例并在所有请求中使用同一个实例?

How to create a Semaphoreslim instance on application startup and use the same instance across all the requests?

我有一个场景,我必须将并行第 3 方 API 调用的数量限制为一次 200。为此,我使用了 SemaphoreSlim 并将可以执行代码块的线程数限制为 200。

这适用于单个 user/request。但是如果同时有多个请求呢?

SemaphoreSlim 等待和释放之间的代码块在 time/any 的任何一点是否只允许 200 个线程。请求数还是每个请求允许 200 个线程?

如果是请求,那么我如何在应用程序启动时创建一个 SemaphoreSlim 实例,以便我可以对所有请求使用同一个实例?

我不认为创建全局信号量并以这种方式干扰 ASP.NET 管理线程池的方式会很好。

快速搜索后,我找到了有关如何限制并发连接的页面,但我不熟悉它,所以这只是一个猜测: https://www.oreilly.com/library/view/mastering-aspnet-core/9781787283688/f460937d-fa5e-439b-afa8-d0a417abc1ea.xhtml

在Program.cs中是单行加法:

如果你想限制你的请求。 Asp.net 核心有一个速率限制实现,可以在 IP 级别或资源级别进行。这将取决于您要如何配置它。这将防止对您的网络 application/api 资源

的恶意攻击

基本上你需要安装这个包

dotnet add package AspNetCoreRateLimit

在你的 ConfigureServices 上你可以做

services.RegisterLimitAndThrottlingMvcConfiguration();

这是扩展方法的实现

private static IServiceCollection RegisterLimitAndThrottlingMvcConfiguration(this IServiceCollection container,
            ServiceLifetime lifeTime = ServiceLifetime.Scoped)
        {
            //rate limiting
            //to store the counters and rules in memory
            container.AddMemoryCache();

            //configuring the options
            container.Configure<IpRateLimitOptions>(options =>
            {
                options.GeneralRules = new List<RateLimitRule>
                {
                    //any resource limit 1000 request every 5 min
                    new RateLimitRule
                    {
                        Endpoint = "*",
                        Limit = 1000,
                        Period = "5m"
                    },
                    //200 request every 10 seconds
                    new RateLimitRule()
                    {
                        Endpoint = "*",
                        Limit = 200,
                        Period = "10s"
                    }
                };
            });

            container.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
            container.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();

            return container;
        }

并在 Configure 方法上设置中间件

//for limiting(header -> X-Rate-Limit- Limit, X-Rate-Limit-Remaining, X-Rate-Limit-Reset
app.UseIpRateLimiting();

关于限制你可以在这上面找一篇不错的文章linklimiting