C# 如何在应用程序启动时创建信号量LIM实例,并在所有请求中使用同一实例?
我有一个场景,我必须将并行第三方API调用的数量限制为每次200个。为此,我使用了SemaphoreSlim并将可执行代码块的线程数限制为200 这对于单个用户/请求很好。但是如果多个请求同时出现怎么办 信号量LIM wait和release之间的代码块在任何时间点/任何数量的请求中只允许200个线程,还是每个请求允许200个线程C# 如何在应用程序启动时创建信号量LIM实例,并在所有请求中使用同一实例?,c#,.net,.net-core,parallel-processing,asp.net-web-api2,C#,.net,.net Core,Parallel Processing,Asp.net Web Api2,我有一个场景,我必须将并行第三方API调用的数量限制为每次200个。为此,我使用了SemaphoreSlim并将可执行代码块的线程数限制为200 这对于单个用户/请求很好。但是如果多个请求同时出现怎么办 信号量LIM wait和release之间的代码块在任何时间点/任何数量的请求中只允许200个线程,还是每个请求允许200个线程 如果是通过请求,那么如何在应用程序启动时创建一个信号量LIM实例,以便对所有请求使用同一个实例?我认为创建全局信号量并以这种方式干预ASP.NET如何管理线程池并不好
如果是通过请求,那么如何在应用程序启动时创建一个信号量LIM实例,以便对所有请求使用同一个实例?我认为创建全局信号量并以这种方式干预ASP.NET如何管理线程池并不好 快速搜索后,我找到了关于如何限制并发连接的页面,但我不熟悉,所以这只是一个猜测: 它是Program.cs中的单行加法:
我认为创建全局信号量并以这种方式干预ASP.NET如何管理线程池并不好 快速搜索后,我找到了关于如何限制并发连接的页面,但我不熟悉,所以这只是一个猜测: 它是Program.cs中的单行加法:
如果您想限制您的请求。Asp.net core有一个速率限制实现,可以在IP级别或资源级别执行。这将取决于您想要如何配置它。这将防止对web应用程序/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;
}
关于限制,如果你想限制你的请求,你可以在这个链接上找到一篇好文章。Asp.net core有一个速率限制实现,可以在IP级别或资源级别执行。这将取决于您想要如何配置它。这将防止对web应用程序/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;
}
对于限制,你可以在这个链接上找到一篇好文章听起来这不是一个应该首先在web服务器上的工作。听起来它应该被卸载到某种形式的外部服务上。听起来这不是应该首先在web服务器上进行的工作。听起来它应该被转移到某种形式的外部服务中。神奇的问题是:当达到200分时会发生什么?如果有人试图连接到该服务,他们是否会出错?可能我不认为这是OP想要的。我猜服务器将向客户端返回503状态代码,因为http想要保持连接,服务器端将有空闲线程。神奇的问题是:当达到200标记时会发生什么?如果有人试图连接到该服务,他们是否会出错?可能我不认为这是OP想要的。我猜服务器将返回503状态代码给客户端,因为http想要保持连接,服务器端将有空闲线程。谢谢你的详细解释。谢谢你的详细解释。