繁体   English   中英

限制 .net 内核中的并发请求

[英]Limit concurrent requests in .net core

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

为了实现这一点,我修改了 program.cs class 之类的

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>();
            });
}

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

我认为我必须只得到 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>

我有警告

元素系统。 web 具有无效的子元素应用程序池

我不能在 iis 上发布 api 或在 iis 快递中运行它

由于 API 将托管在 IIS 中,因此不会使用 Kestrel 的配置。

要在 IIS 中设置最大并发连接数,您可以打开 IIS 管理器 window。 Select 来自服务器节点的站点。 然后,从操作窗格中进行 select高级设置 您可以在“行为”部分下看到“限制”。 根据您的要求设置最大并发连接值。 像这样:

在此处输入图像描述

[注意] 此设置适用于所有站点。

此外,您还可以查看此示例并创建自定义中间件来限制请求。

选项serverOptions.Limits.MaxConcurrentConnections限制 tcp 连接到 Kestrel 的最大数量,而不是并发 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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM