Вы можете использовать ASP. NET Пределы Core Kestrel для создания соответствующих конфигов
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.core.kestrelserverlimits?view=aspnetcore-3.1
Это можно сделать через конфиги в Программе .cs
#elif Limits
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
#region snippet_Limits
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
#endregion
.UseStartup<Startup>();
});
#elif Port0
Параметры Kestrel также можно установить с помощью поставщика конфигурации. Например, поставщик конфигурации файлов (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#file -configuration-provider ) может загружать конфигурацию Kestrel из наборов приложений. json или наборов приложений. {Environment}. json файл:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
Кроме того, если вам нужно управлять этими вещами с помощью кода, вы можете попытаться справиться с этим с помощью промежуточного программного обеспечения
public class RequestFilterMiddleware
{
private readonly RequestDelegate _next;
private const long _allowedRequestQueryStringMaxLength = 100;
private const long _allowedUrlStringMaxLength = 100;
public RequestFilterMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
var queryStringLength = httpContext.Request.QueryString.Value?.Length;
if (queryStringLength > _allowedRequestQueryStringMaxLength)
{
//throw exception or send some appropriate http status code
}
var urlRequestLength = httpContext.Request.GetDisplayUrl().Length;
if (urlRequestLength > _allowedUrlStringMaxLength)
{
//throw exception or send some appropriate http status code
}
using (var TokenSource = System.Threading.CancellationTokenSource.CreateLinkedTokenSource(httpContext.RequestAborted))
{
httpContext.RequestAborted = TokenSource.Token;
var DelayTask = Task.Delay(500, TokenSource.Token);
var NextTask = _next.Invoke(httpContext);
if (await Task.WhenAny(DelayTask, NextTask).ConfigureAwait(false) == DelayTask)
{
//LogStuff for long running requests
}
TokenSource.Cancel();
}
await _next(httpContext);
}
}
К сожалению, опция тайм-аута в Kestrel на данный момент недоступна, для получения дополнительной информации вы можете прочитать эту топи c https://github.com/dotnet/aspnetcore/issues/10079
Однако, по крайней мере, возможно регистрировать длительно выполняющиеся запросы на производстве для последующей оптимизации.