限制.net core中的并发请求

dim*_*its 1 c# .net-core asp.net-core

我正在尝试配置我的 .net core API 以限制请求。

为了实现这一点,我修改了program.cs类,例如

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();            
    }


    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(serverOptions =>
                {
                    serverOptions.Limits.MaxConcurrentConnections = 2;
                })
                //.UseContentRoot(Directory.GetCurrentDirectory())
                //.UseIISIntegration()
                .UseStartup<Startup>();
            });
}
Run Code Online (Sandbox Code Playgroud)

但问题是,当我使用超过 2 个线程的控制台应用程序调用 API 时,我会收到所有线程调用的响应。我已经在本地 IIS 电脑上部署-发布了 API。

我认为我必须只得到 2 个响应,然后对于其他呼叫我将得到 503 服务不可用。

我的代码有什么问题吗?

编辑 我已阅读这篇文章How to configure concurrency in .NET Core Web API? ,问题是当我添加 web.config 时

 <configuration>
    <system.web>
        <applicationPool
            maxConcurrentRequestsPerCPU="5000"
            maxConcurrentThreadsPerCPU="0"
            requestQueueLimit="5000" />
    </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我有警告

元素系统。web 具有无效的子元素 applicationpool

我无法在 iis 上发布 api 或在 iis Express 中运行它

vic*_*710 5

选项serverOptions.Limits.MaxConcurrentConnections限制与 Kestrel 的最大 tcp 连接数,而不是并发 http 请求数。通过每个 tcp 连接,仍然可能有多个并发的 http 请求。这就是为什么在您的测试中,即使有超过 2 个并发 http 请求,您也看不到任何错误。

为了限制.NET Core(或.NET 5+)中并发http请求的数量,可以使用ConcurrencyLimiterMiddleware(包Microsoft.AspNetCore.ConcurrencyLimiter)。这是一个例子:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddStackPolicy(options =>
        {
            options.MaxConcurrentRequests = 2;
            options.RequestQueueLimit = 25;
        });
    }

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        app.UseConcurrencyLimiter();
    }
}
Run Code Online (Sandbox Code Playgroud)