Настройка параметров веб-сервера Kestrel для ASP.NET Core

Веб-сервер Kestrel имеет ограничивающие параметры конфигурации, которые удобно использовать в развертываниях с выходом в Интернет. Чтобы настроить Kestrel параметры конфигурации, вызовите команду ConfigureKestrel в Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    // ...
});

Задать ограничения для свойства KestrelServerOptions.Limits. Это свойство содержит экземпляр класса KestrelServerLimits.

Общие ограничения

Время ожидания проверки на активность

KeepAliveTimeout возвращает или задает время ожидания проверки на активность:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});

Это время ожидания не применяется при присоединении отладчика к Kestrel процессу.

Максимальное число клиентских подключений

MaxConcurrentConnections возвращает или задает максимальное количество открытых подключений к службе:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
});

MaxConcurrentUpgradedConnections возвращает или задает максимальное количество открытых, обновленных подключений к службе:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});

Обновленное соединение — это подключение, которое было переключено с HTTP на другой протокол, например WebSockets. После изменения подключение не учитывается в пределе MaxConcurrentConnections.

Maximum request body size (Максимальный размер текста запроса)

MaxRequestBodySize возвращает или задает максимально допустимый размер текста запроса в байтах.

Чтобы переопределить это ограничение в приложении MVC ASP.NET Core, мы рекомендуем использовать атрибут RequestSizeLimitAttribute в методе действия:

[RequestSizeLimit(100_000_000)]
public IActionResult Get()

В следующем примере выполняется настройка MaxRequestBodySize для всех запросов:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});

В следующем примере выполняется настройка MaxRequestBodySize для конкретного запроса, использующегося IHttpMaxRequestBodySizeFeature в настраиваемом ПО промежуточного слоя:

app.Use(async (context, next) =>
{
    var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();

    if (httpMaxRequestBodySizeFeature is not null)
        httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;

    // ...

    await next(context);
});

Если приложение пытается настроить ограничение на запросы после того, как оно уже начало чтение запроса, выдается исключение. Используйте свойство IHttpMaxRequestBodySizeFeature.IsReadOnly, чтобы проверить, является ли оно защищенным для установки свойства MaxRequestBodySize.

При запуске приложения вне процесса, который обслуживает модуль ASP.NET Core, IIS устанавливает ограничение, ограничение на размер текста запроса Kestrel будет отключено.

Minimum request body data rate (Минимальная скорость передачи данных в тексте запроса)

Kestrel каждую секунду проверяет, поступают ли данные с указанной скоростью в байтах в секунду. Если скорость падает ниже минимума, для подключения истекает время ожидания. Льготный период — это время, которое Kestrel дает клиенту на увеличение его скорости отправки до минимального уровня. В течение этого периода скорость не проверяется. Льготный период помогает избежать разрыва соединений, которые первоначально отправляют данные с небольшой скоростью из-за медленного запуска TCP. Минимальная скорость также применяется к отклику.

MinRequestBodyDataRate возвращает или задает минимальную скорость передачи текста запроса в байтах в секунду. MinResponseDataRate возвращает или задает минимальную скорость ответа в байтах в секунду.

В следующем примере выполняется настройка MinRequestBodyDataRate и MinResponseDataRate для всех запросов:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(
        bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate = new MinDataRate(
        bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});

В следующем примере выполняется настройка MinRequestBodyDataRate и MinResponseDataRate для конкретного запроса, использующегося IHttpMinRequestBodyDataRateFeature и IHttpMinResponseDataRateFeature в настраиваемом ПО промежуточного слоя:

app.Use(async (context, next) =>
{
    var httpMinRequestBodyDataRateFeature = context.Features
        .Get<IHttpMinRequestBodyDataRateFeature>();

    if (httpMinRequestBodyDataRateFeature is not null)
    {
        httpMinRequestBodyDataRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    var httpMinResponseDataRateFeature = context.Features
        .Get<IHttpMinResponseDataRateFeature>();

    if (httpMinResponseDataRateFeature is not null)
    {
        httpMinResponseDataRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    // ...

    await next(context);
});

IHttpMinResponseDataRateFeature не присутствует в HttpContext.Features для запросов HTTP/2. Изменение ограничений скорости на уровне отдельных запросов обычно не поддерживается для HTTP/2, поскольку этот протокол поддерживает мультиплексирование запросов. Но возможности IHttpMinRequestBodyDataRateFeature все еще присутствуют в HttpContext.Features для запросов HTTP/2, так как ограничение скорости чтения может быть полностью отключено для отдельных запросов. Чтобы сделать это, задайте для параметра IHttpMinResponseDataRateFeature.MinDataRate значение null (даже для запроса HTTP/2). Попытки прочитать свойство IHttpMinRequestBodyDataRateFeature.MinDataRate или попытки установить для него значение, отличное от null, приводят к ошибке NotSupportedException для запросов HTTP/2.

Ограничения скорости на уровне сервера, которые настроены с помощью KestrelServerOptions.Limits, по-прежнему применяются к подключениям HTTP/1.x и HTTP/2.

Время ожидания для заголовков запросов

RequestHeadersTimeout возвращает или задает максимальное время, которое сервер уделяет получению заголовков запросов.

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});

Это время ожидания не применяется при присоединении отладчика к Kestrel процессу.

Ограничения HTTP/2

В этом разделе ограничения устанавливаются в KestrelServerLimits.Http2.

Максимальное число потоков на подключение

MaxStreamsPerConnection ограничивает количество параллельных потоков запросов для одного соединения HTTP/2. Потоки сверх этого числа будут отклонены.

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});

Размер таблицы заголовка

HeaderTableSize ограничивает размер таблиц сжатия заголовков в октетах, которые могут использоваться кодировщиком HPACK и декодером на сервере. Декодер HPACK распаковывает заголовки HTTP для подключений HTTP/2.

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.HeaderTableSize = 4096;
});

Максимальный размер кадра

MaxFrameSize указывает размер самых крупных полезных данных кадра, которые могут быть получены в октетах:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});

Максимальный размер запроса заголовка

MaxRequestHeaderFieldSize указывает максимально допустимый размер последовательности полей заголовка запроса. Это ограничение применяется к последовательностям имен и значений в их сжатых и несжатых представлениях.

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});

Размер окна начального подключения

InitialConnectionWindowSize указывает, сколько данных текста запроса сервер готов принять и буферизировать за один раз, агрегируя все запросы (потоки) на одно соединение:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});

Размеры запросов также ограничиваются параметром InitialStreamWindowSize.

Размер окна начального потока

InitialStreamWindowSize указывает, сколько данных текста запроса сервер готов принять и буферизировать за один раз, на один поток данных:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});

Размеры запросов также ограничиваются параметром InitialConnectionWindowSize.

Конфигурация проверки связи для проверки активности HTTP/2

Kestrel можно настроить для отправки пакетов проверки связи HTTP/2 подключенным клиентам. Проверка связи HTTP/2 служит нескольким целям.

  • Сохранение активности бездействующего подключения. Некоторые клиенты и прокси-серверы закрывают неактивные соединения. Проверки связи HTTP/2 рассматриваются как активность подключения и препятствуют закрытию соединения как бездействующего.
  • Закрытие неработоспособных подключений. Подключения, в которых клиент не отвечает на проверку связи для проверки активности в течение заданного времени, закрываются сервером.

Для настройки проверки связи для проверки активности HTTP/2 есть два параметра.

  • KeepAlivePingDelay — это TimeSpan, который настраивает интервал проверки связи. Если сервер не получает никаких кадров данных в течение этого периода времени, он отправляет клиенту пакеты проверки связи для проверки активности. Если для этого параметра задано значение TimeSpan.MaxValue, то проверка связи для проверки активности отключена.
  • KeepAlivePingTimeout — это TimeSpan, который настраивает время ожидания проверки связи. Если сервер не получает никаких кадров данных, например ответ на запрос проверки связи, подключение закрывается. Если для этого параметра задано значение TimeSpan.MaxValue, то время ожидания проверки активности отключено.

В следующем примере задается значение KeepAlivePingDelay и KeepAlivePingTimeout:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromMinutes(1);
});

Другие варианты

Синхронный ввод-вывод

AllowSynchronousIO определяет, разрешены ли синхронные операции ввода-вывода для запроса и ответа.

Предупреждение

Выполнение большого числа заблокированных операций синхронного ввода-вывода может привести к перегрузке пула потоков и зависанию приложения. Включайте AllowSynchronousIO, только если вы используете библиотеку, которая не поддерживает асинхронные операции ввода-вывода.

В примере ниже включаются синхронные операции ввода-вывода:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.AllowSynchronousIO = true;
});

Сведения о других параметрах и ограничениях Kestrel см. в следующих разделах:

Поведение с присоединенным отладчиком

Некоторые ограничения времени ожидания и скорости не применяются при присоединении отладчика к Kestrel процессу. Дополнительные сведения см. в разделе "Поведение с подключенным отладчиком".

Веб-сервер Kestrel имеет ограничивающие параметры конфигурации, которые удобно использовать в развертываниях с выходом в Интернет.

Чтобы предоставить дополнительную конфигурацию после вызова ConfigureWebHostDefaults, используйте ConfigureKestrel:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Задать ограничения для свойства Limits в классе KestrelServerOptions. Свойство Limits содержит экземпляр класса KestrelServerLimits.

В следующих примерах используется пространство имен Microsoft.AspNetCore.Server.Kestrel.Core.

using Microsoft.AspNetCore.Server.Kestrel.Core;

Примечание.

KestrelServerOptions и конфигурацию конечных точек можно настроить из поставщиков конфигурации. Оставшаяся конфигурация Kestrel должна настраиваться в коде C#.

Общие ограничения

Время ожидания проверки на активность

KeepAliveTimeout

Получает или задает время ожидания проверки на активность. Значение по умолчанию — 2 минуты.

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

Максимальное число клиентских подключений

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

Максимальное число одновременно открытых подключений TCP для всего приложения можно задать с помощью следующего кода:

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

Существует отдельный предел по подключениям, измененным с HTTP или HTTPS на другой протокол (например, по запросу WebSocket). После изменения подключение не учитывается в пределе MaxConcurrentConnections.

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

По умолчанию максимальное число подключений не ограничено (null).

Maximum request body size (Максимальный размер текста запроса)

MaxRequestBodySize

По умолчанию максимальный размер текста запроса составляет 30 000 000 байт, что примерно соответствует 28,6 МБ.

Чтобы переопределить это ограничение в приложении MVC ASP.NET Core, мы рекомендуем использовать атрибут RequestSizeLimitAttribute в методе действия:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

В следующем примере показано, как настроить ограничение для приложения и каждого запроса:

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

Переопределите параметр для конкретного запроса в ПО промежуточного слоя:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature =
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature =
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

Если приложение пытается настроить ограничение для запроса после того, как оно начало считывать запрос, возникает исключение. Доступно свойство IsReadOnly, указывающее, что свойство MaxRequestBodySize находится в состоянии только для чтения и настраивать ограничение слишком поздно.

При запуске приложения вне процесса, который обслуживает модуль ASP.NET Core, ограничение на размер текста запроса Kestrel будет отключено. Это связано с тем, что оно уже задается в IIS.

Minimum request body data rate (Минимальная скорость передачи данных в тексте запроса)

MinRequestBodyDataRate
MinResponseDataRate

Kestrel каждую секунду проверяет, поступают ли данные с указанной скоростью в байтах в секунду. Если скорость падает ниже минимума, для подключения истекает время ожидания. Льготный период — это время, которое Kestrel дает клиенту на увеличение его скорости отправки до минимального уровня. В течение этого периода скорость не проверяется. Льготный период помогает избежать разрыва соединений, которые первоначально отправляют данные с небольшой скоростью из-за медленного запуска TCP.

Минимальная скорость по умолчанию составляет 240 байт/с, льготный период равен 5 секундам.

Минимальная скорость также применяется к отклику. Код для задания лимита запросов и лимита откликов различается только наличием RequestBody или Response в именах свойств и интерфейсов.

Ниже приведен пример, в который показано, как настроить минимальные показатели данных в Program.cs:

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

Переопределите ограничения минимальной скорости для каждого запроса в ПО промежуточного слоя:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature =
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature =
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

IHttpMinResponseDataRateFeature, который упоминается в предыдущем примере, отсутствует в HttpContext.Features для запросов HTTP/2. Изменение ограничений скорости на уровне отдельных запросов обычно не поддерживается для HTTP/2, поскольку этот протокол поддерживает мультиплексирование запросов. Но возможности IHttpMinRequestBodyDataRateFeature все еще присутствуют в HttpContext.Features для запросов HTTP/2, так как ограничение скорости чтения может быть полностью отключено для отдельных запросов. Чтобы сделать это, задайте для параметра IHttpMinResponseDataRateFeature.MinDataRate значение null (даже для запроса HTTP/2). При попытке чтения свойства IHttpMinRequestBodyDataRateFeature.MinDataRate или при попытке задать для него значение, отличное от null, возникнет исключение NotSupportedException для запроса HTTP/2.

Ограничения скорости на уровне сервера, которые настроены с помощью KestrelServerOptions.Limits, по-прежнему применяются к подключениям HTTP/1.x и HTTP/2.

Время ожидания для заголовков запросов

RequestHeadersTimeout

Получает или задает максимальное время, которое сервер уделяет получению заголовков запросов. Значение по умолчанию — 30 секунд.

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

Ограничения HTTP/2

В этом разделе ограничения устанавливаются в KestrelServerLimits.Http2.

Максимальное число потоков на подключение

MaxStreamsPerConnection

Ограничивает количество параллельных потоков запросов для одного подключения HTTP/2. Потоки сверх этого числа будут отклонены.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});

Значение по умолчанию — 100.

Размер таблицы заголовка

HeaderTableSize

Декодер HPACK распаковывает заголовки HTTP для подключений HTTP/2. HeaderTableSize ограничивает размер таблицы сжатия заголовка, которую использует декодер HPACK. Это значение указывается в октетах и должно быть больше нуля (0).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.HeaderTableSize = 4096;
});

Значение по умолчанию — 4096.

Максимальный размер кадра

MaxFrameSize

Указывает максимально допустимый размер полезных данных в кадре подключения HTTP/2, получаемых или отправляемых сервером. Это значение указывается в октетах и должно находиться в пределах от 2^14 (16 384) до 2^24-1 (16 777 215).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16384;
});

Значение по умолчанию — 2^14 (16 384).

Максимальный размер запроса заголовка

MaxRequestHeaderFieldSize

Указывает максимально допустимый размер значений заголовка запроса (в октетах). Это ограничение применяется к имени и значению в их сжатых и несжатых представлениях. Значение должно быть больше нуля.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});

Значение по умолчанию — 8 192.

Размер окна начального подключения

InitialConnectionWindowSize

Указывает максимальный объем данных текста запроса (в байтах), буферизируемый сервером за один раз, для всех запросов (потоков) на каждое подключение. Размеры запросов также ограничиваются параметром Http2.InitialStreamWindowSize. Значение должно быть больше или равно 65 535 и меньше 2^31 (2 147 483 648).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});

Значение по умолчанию — 128 КБ (131 072).

Размер окна начального потока

InitialStreamWindowSize

Указывает максимальный объем данных текста запроса (в байтах), буферизируемый сервером за один раз, для каждого запроса (потока). Размеры запросов также ограничиваются параметром InitialConnectionWindowSize. Значение должно быть больше или равно 65 535 и меньше 2^31 (2 147 483 648).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});

Значение по умолчанию — 96 КБ (98 304).

Конфигурация проверки связи для проверки активности HTTP/2

Kestrel можно настроить для отправки пакетов проверки связи HTTP/2 подключенным клиентам. Проверка связи HTTP/2 служит нескольким целям.

  • Сохранение активности бездействующего подключения. Некоторые клиенты и прокси-серверы закрывают неактивные соединения. Проверки связи HTTP/2 рассматриваются как активность подключения и препятствуют закрытию соединения как бездействующего.
  • Закрытие неработоспособных подключений. Подключения, в которых клиент не отвечает на проверку связи для проверки активности в течение заданного времени, закрываются сервером.

Для настройки проверки связи для проверки активности HTTP/2 есть два параметра.

  • KeepAlivePingDelay — это TimeSpan, который настраивает интервал проверки связи. Если сервер не получает никаких кадров данных в течение этого периода времени, он отправляет клиенту пакеты проверки связи для проверки активности. Если для этого параметра задано значение TimeSpan.MaxValue, то проверка связи для проверки активности отключена. Значение по умолчанию — TimeSpan.MaxValue.
  • KeepAlivePingTimeout — это TimeSpan, который настраивает время ожидания проверки связи. Если сервер не получает никаких кадров данных, например ответ на запрос проверки связи, подключение закрывается. Если для этого параметра задано значение TimeSpan.MaxValue, то время ожидания проверки активности отключено. Значение по умолчанию — 20 секунд.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Другие варианты

Синхронный ввод-вывод

AllowSynchronousIO определяет, разрешены ли синхронные операции ввода-вывода для запроса и ответа. Значение по умолчанию — false.

Предупреждение

Выполнение большого числа заблокированных операций синхронного ввода-вывода может привести к перегрузке пула потоков и зависанию приложения. Включайте AllowSynchronousIO, только если вы используете библиотеку, которая не поддерживает асинхронные операции ввода-вывода.

В примере ниже включаются синхронные операции ввода-вывода:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.AllowSynchronousIO = true;
})

Сведения о других параметрах и ограничениях Kestrel см. в следующих разделах: