Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在应用程序启动时创建信号量LIM实例,并在所有请求中使用同一实例?_C#_.net_.net Core_Parallel Processing_Asp.net Web Api2 - Fatal编程技术网

C# 如何在应用程序启动时创建信号量LIM实例,并在所有请求中使用同一实例?

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如何管理线程池并不好

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

这对于单个用户/请求很好。但是如果多个请求同时出现怎么办

信号量LIM wait和release之间的代码块在任何时间点/任何数量的请求中只允许200个线程,还是每个请求允许200个线程


如果是通过请求,那么如何在应用程序启动时创建一个信号量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想要保持连接,服务器端将有空闲线程。谢谢你的详细解释。谢谢你的详细解释。