Configuración de opciones para el servidor web Kestrel de ASP.NET Core

El servidor web Kestrel tiene opciones de configuración de restricción que son especialmente útiles en las implementaciones con conexión a Internet. Para configurar las opciones de configuración de Kestrel, llame a ConfigureKestrel en Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Establezca restricciones en la propiedad KestrelServerOptions.Limits. Esta propiedad contiene una instancia de la clase KestrelServerLimits.

Límites generales

Tiempo de expiración de la conexión persistente

KeepAliveTimeout obtiene o establece el tiempo de expiración de la conexión persistente:

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

Este tiempo de espera no se aplica cuando hay un depurador asociado al proceso Kestrel.

Las conexiones máximas de cliente

MaxConcurrentConnections obtiene o establece el número máximo de conexiones abiertas:

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

MaxConcurrentUpgradedConnections obtiene o establece el número máximo de conexiones abiertas y actualizadas:

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

Una conexión actualizada es la que se ha cambiado de HTTP a otro protocolo, como WebSockets. Cuando se actualiza una conexión, no se cuenta con respecto al límite de MaxConcurrentConnections.

El tamaño máximo del cuerpo de solicitud

MaxRequestBodySize obtiene o establece el tamaño máximo permitido de cualquier cuerpo de solicitud en bytes.

El método recomendado para invalidar el límite de una aplicación ASP.NET Core MVC es usar el atributo RequestSizeLimitAttribute en un método de acción:

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

En el ejemplo siguiente se configura MaxRequestBodySize para todas las solicitudes:

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

En el ejemplo siguiente se configura MaxRequestBodySize para una solicitud específica mediante IHttpMaxRequestBodySizeFeature en un middleware personalizado:

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

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

    // ...

    await next(context);
});

Si la aplicación intenta configurar el límite de una solicitud después de que la aplicación haya empezado a leerla, se inicia una excepción. Ue la propiedad IHttpMaxRequestBodySizeFeature.IsReadOnly para comprobar si es seguro establecer la propiedad MaxRequestBodySize.

Cuando una aplicación se ejecuta fuera de proceso detrás del módulo de ASP.NET Core, IIS establece el límite y se deshabilita el límite de tamaño del cuerpo de la solicitud de Kestrel.

La velocidad mínima de los datos del cuerpo de solicitud.

Kestrel comprueba cada segundo si los datos entran a la velocidad especificada en bytes por segundo. Si la velocidad está por debajo del mínimo, se agota el tiempo de espera de la conexión. El período de gracia es la cantidad de tiempo que Kestrel permite al cliente aumentar su velocidad de envío hasta el mínimo. Durante ese tiempo no se comprueba la velocidad. El período de gracia permite evitar que se interrumpan las conexiones que inicialmente envían datos a una velocidad lenta debido a un inicio lento de TCP. También se aplica una velocidad mínima a la respuesta.

MinRequestBodyDataRate obtiene o establece la velocidad de datos mínima del cuerpo de la solicitud en bytes por segundo. MinResponseDataRate obtiene o establece la velocidad de datos mínima de la respuesta en bytes por segundo.

En el ejemplo siguiente se configuran MinRequestBodyDataRate y MinResponseDataRate para todas las solicitudes:

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

En el ejemplo siguiente se configuran MinRequestBodyDataRate y MinResponseDataRate para una solicitud específica mediante IHttpMinRequestBodyDataRateFeature y IHttpMinResponseDataRateFeature en un middleware personalizado:

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 no está presente en HttpContext.Features para solicitudes HTTP/2. La modificación de los límites de velocidad por cada solicitud no suele ser compatible con HTTP/2, debido a la compatibilidad del protocolo con la multiplexación de solicitudes. Pero IHttpMinRequestBodyDataRateFeature sigue presente en HttpContext.Features para las solicitudes HTTP/2, ya que el límite de velocidad de lectura aún puede estar completamente deshabilitado por cada solicitud si se establece IHttpMinResponseDataRateFeature.MinDataRate en null incluso para una solicitud HTTP/2. Los intentos de lectura de IHttpMinRequestBodyDataRateFeature.MinDataRate, o los intentos para establecerlo en un valor distinto de null, dan como resultado NotSupportedException para las solicitudes HTTP/2.

Se siguen aplicando límites de velocidad en todo el servidor configurados con KestrelServerOptions.Limits a las conexiones HTTP/1.x y HTTP/2.

Tiempo de expiración de los encabezados de solicitud

RequestHeadersTimeout obtiene o establece la cantidad máxima de tiempo que el servidor dedica a recibir encabezados de solicitud:

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

Este tiempo de espera no se aplica cuando hay un depurador asociado al proceso Kestrel.

Límites de HTTP/2

Los límites de esta sección se establecen en KestrelServerLimits.Http2.

Secuencias máximas por conexión

MaxStreamsPerConnection limita el número de secuencias de solicitudes simultáneas por conexión HTTP/2. Se rechazarán las secuencias en exceso:

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

Tamaño de la tabla de encabezado

HeaderTableSize limita el tamaño de las tablas de compresión de encabezado, en octetos, que el codificador HPACK y el descodificador del servidor pueden usar. El descodificador HPACK descomprime los encabezados HTTP para las conexiones HTTP/2:

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

Tamaño máximo de marco

MaxFrameSize indica el tamaño de la carga de fotogramas más grande que se puede recibir, en octetos:

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

Tamaño máximo del encabezado de solicitud

MaxRequestHeaderFieldSize indica el tamaño máximo permitido de una secuencia de campo de encabezado de solicitud. Este límite se aplica a las secuencias de nombre y valor en sus representaciones comprimidas y sin comprimir:

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

Tamaño inicial de la ventana de conexión

InitialConnectionWindowSize indica la cantidad de datos del cuerpo de la solicitud que el servidor está dispuesto a recibir y almacenar en búfer a la vez agregados en todas las solicitudes (flujos) por conexión:

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

Las solicitudes también están limitadas por InitialStreamWindowSize.

Tamaño inicial de la ventana de transmisión

InitialStreamWindowSize indica la cantidad de datos del cuerpo de la solicitud que el servidor está dispuesto a recibir y almacenar en búfer a la vez por secuencia:

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

Las solicitudes también están limitadas por InitialConnectionWindowSize.

Configuración de pings de mantenimiento de conexión HTTP/2

Kestrel se puede configurar de modo que envíe pings HTTP/2 a los clientes conectados. Los pings HTTP/2 tienen varios fines:

  • Mantener activas las conexiones inactivas. Algunos clientes y servidores proxy cierran las conexiones que están inactivas. Los pings HTTP/2 se consideran una actividad en una conexión y evitan que la conexión se cierre por considerarse inactiva.
  • Cerrar las conexiones incorrectas. El servidor cierra aquellas conexiones en las que el cliente no responde al ping de mantenimiento de conexión en el tiempo configurado.

Hay dos opciones de configuración relacionadas con los pings de mantenimiento de conexión HTTP/2:

  • KeepAlivePingDelay es un elemento TimeSpan que configura el intervalo de ping. El servidor envía un ping de mantenimiento de conexión al cliente si no recibe ningún fotograma durante este período de tiempo. Los pings de mantenimiento de conexión se deshabilitan cuando esta opción se establece en TimeSpan.MaxValue.
  • KeepAlivePingTimeout es un TimeSpan que configura el tiempo de espera de los pings. Si el servidor no recibe ningún fotograma, como un ping de respuesta, durante este tiempo de espera, se cierra la conexión. El tiempo de espera de mantenimiento de conexión se deshabilita cuando esta opción se establece en TimeSpan.MaxValue.

En el siguiente ejemplo se establecen KeepAlivePingDelay y KeepAlivePingTimeout:

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

Otras opciones

E/S síncrona

AllowSynchronousIO controla si se permite la E/S sincrónica para la solicitud y la respuesta.

Advertencia

Un gran número de operaciones de E/S sincrónicas de bloqueo puede dar lugar al colapso del grupo de subprocesos, lo que hace que la aplicación no responda. Habilite solo AllowSynchronousIO al usar una biblioteca que no admite la E/S asincrónica.

En el ejemplo siguiente se habilita la E/S sincrónica:

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

Para más información sobre otras opciones y límites de Kestrel, vea:

Comportamiento con el depurador asociado

Algunos tiempos de espera y límites de velocidad no se aplican cuando hay un depurador asociado a un proceso Kestrel. Para más información, consulte Comportamiento con el depurador asociado.

El servidor web Kestrel tiene opciones de configuración de restricción que son especialmente útiles en las implementaciones con conexión a Internet.

Para proporcionar configuración adicional después de llamar a ConfigureWebHostDefaults, use ConfigureKestrel:

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

Establezca restricciones en la propiedad Limits de la clase KestrelServerOptions. La propiedad Limits contiene una instancia de la clase KestrelServerLimits.

En los ejemplos siguientes se usa el espacio de nombres Microsoft.AspNetCore.Server.Kestrel.Core:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Nota:

KestrelServerOptions y la KestrelServerOptions se pueden establecer a partir de proveedores de configuración. El resto de la configuración de Kestrel debe establecerse en código de C#.

Límites generales

Tiempo de expiración de la conexión persistente

KeepAliveTimeout

Obtiene o establece el tiempo de expiración de la conexión persistente. El valor predeterminado es de 2 minutos.

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

Las conexiones máximas de cliente

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

El número máximo de conexiones de TCP abiertas simultáneas que se pueden establecer para toda la aplicación con este código:

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

Hay un límite independiente para las conexiones que se han actualizado desde HTTP o HTTPS a otro protocolo (por ejemplo, en una solicitud de WebSockets). Cuando se actualiza una conexión, no se cuenta con respecto al límite de 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);
})

El número máximo de conexiones es ilimitado de forma predeterminada (null).

El tamaño máximo del cuerpo de solicitud

MaxRequestBodySize

El tamaño máximo predeterminado del cuerpo de solicitud es 30 000 000 bytes, que son aproximadamente 28,6 MB.

El método recomendado para invalidar el límite de una aplicación ASP.NET Core MVC es usar el atributo RequestSizeLimitAttribute en un método de acción:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

En el siguiente ejemplo se muestra cómo configurar la restricción de la aplicación en cada solicitud:

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

Invalide la configuración en una solicitud específica de middleware:

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

Se inicia una excepción si la aplicación configura el límite de una solicitud después de que la aplicación haya empezado a leer la solicitud. Hay una propiedad IsReadOnly que señala si la propiedad MaxRequestBodySize tiene el estado de solo lectura, lo que significa que es demasiado tarde para configurar el límite.

Cuando se ejecuta una aplicación fuera de proceso detrás del módulo de ASP.NET Core, se deshabilita el límite de tamaño del cuerpo de la solicitud de Kestrel. IIS ya establece el límite.

La velocidad mínima de los datos del cuerpo de solicitud.

MinRequestBodyDataRate
MinResponseDataRate

Kestrel comprueba cada segundo si los datos entran a la velocidad especificada en bytes por segundo. Si la velocidad está por debajo del mínimo, se agota el tiempo de espera de la conexión. El período de gracia es la cantidad de tiempo que Kestrel permite al cliente aumentar su velocidad de envío hasta el mínimo. Durante ese tiempo no se comprueba la velocidad. El período de gracia permite evitar que se interrumpan las conexiones que inicialmente envían datos a una velocidad lenta debido a un inicio lento de TCP.

La velocidad mínima predeterminada es de 240 bytes por segundo, con un período de gracia de 5 segundos.

También se aplica una velocidad mínima a la respuesta. El código para establecer el límite de solicitudes y el límite de respuestas es el mismo, salvo que tienen RequestBody o Response en los nombres de propiedad y de interfaz.

Este es un ejemplo que muestra cómo configurar las velocidades de datos mínimas en 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);
})

Invalide los límites de velocidad mínima por solicitud en el middleware:

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

El elemento IHttpMinResponseDataRateFeature al que se hace referencia en el ejemplo anterior no está presente en HttpContext.Features para las solicitudes HTTP/2. La modificación de los límites de velocidad por cada solicitud no suele ser compatible con HTTP/2, debido a la compatibilidad del protocolo con la multiplexación de solicitudes. Sin embargo, IHttpMinRequestBodyDataRateFeature sigue estando presente en HttpContext.Features para las solicitudes HTTP/2, ya que el límite de velocidad de lectura aún puede estar completamente deshabilitado por solicitud estableciendo IHttpMinResponseDataRateFeature.MinDataRate en null incluso para una solicitud HTTP/2. Si se intenta leer IHttpMinRequestBodyDataRateFeature.MinDataRate o se intenta su establecimiento en un valor distinto de null, se obtendrá una excepción NotSupportedException con una solicitud HTTP/2 dada.

Se siguen aplicando límites de velocidad en todo el servidor configurados con KestrelServerOptions.Limits a las conexiones HTTP/1.x y HTTP/2.

Tiempo de expiración de los encabezados de solicitud

RequestHeadersTimeout

Obtiene o establece la cantidad máxima de tiempo que el servidor pasa recibiendo las cabeceras de las solicitudes. El valor predeterminado es 30 segundos.

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

Límites de HTTP/2

Los límites de esta sección se establecen en KestrelServerLimits.Http2.

Secuencias máximas por conexión

MaxStreamsPerConnection

Limita el número de secuencias de solicitudes simultáneas por conexión HTTP/2. Se rechazarán las secuencias en exceso.

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

El valor predeterminado es 100.

Tamaño de la tabla de encabezado

HeaderTableSize

El descodificador HPACK descomprime los encabezados HTTP para las conexiones HTTP/2. HeaderTableSize limita el tamaño de la tabla de compresión de encabezado que usa el descodificador HPACK. El valor se proporciona en octetos y debe ser mayor que cero (0).

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

El valor predeterminado es 4096.

Tamaño máximo de marco

MaxFrameSize

Indica el tamaño máximo permitido de una carga de marco de conexión HTTP/2 recibida o enviada por el servidor. El valor se proporciona en octetos y debe estar comprendido entre 2^14 (16 384) y 2^24-1 (16 777 215).

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

El valor predeterminado es 2^14 (16 384).

Tamaño máximo del encabezado de solicitud

MaxRequestHeaderFieldSize

Indica el tamaño máximo permitido (en octetos) de los valores de los encabezados de solicitud. Este límite se aplica al nombre y al valor en sus representaciones comprimidas y no comprimidas. El valor debe ser mayor que cero (0).

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

El valor predeterminado es 8192.

Tamaño inicial de la ventana de conexión

InitialConnectionWindowSize

Indica la cantidad máxima de datos del cuerpo de solicitud (en bytes) que el servidor almacena en búfer a la vez de forma agregada en todas las solicitudes (transmisiones) por conexión. Las solicitudes también están limitadas por Http2.InitialStreamWindowSize. El valor debe ser igual o mayor que 65 535 y menor que 2^31 (2 147 483 648).

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

El valor predeterminado es 128 KB (131 072).

Tamaño inicial de la ventana de transmisión

InitialStreamWindowSize

Indica la cantidad máxima de datos del cuerpo de solicitud (en bytes) que el servidor almacena en búfer a la vez por solicitud (transmisión). Las solicitudes también están limitadas por InitialConnectionWindowSize. El valor debe ser igual o mayor que 65 535 y menor que 2^31 (2 147 483 648).

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

El valor predeterminado es 96 KB (98 304).

Configuración de pings de mantenimiento de conexión HTTP/2

Kestrel se puede configurar de modo que envíe pings HTTP/2 a los clientes conectados. Los pings HTTP/2 tienen varios fines:

  • Mantener activas las conexiones inactivas. Algunos clientes y servidores proxy cierran las conexiones que están inactivas. Los pings HTTP/2 se consideran una actividad en una conexión y evitan que la conexión se cierre por considerarse inactiva.
  • Cerrar las conexiones incorrectas. El servidor cierra aquellas conexiones en las que el cliente no responde al ping de mantenimiento de conexión en el tiempo configurado.

Hay dos opciones de configuración relacionadas con los pings de mantenimiento de conexión HTTP/2:

  • KeepAlivePingDelay es un elemento TimeSpan que configura el intervalo de ping. El servidor envía un ping de mantenimiento de conexión al cliente si no recibe ningún fotograma durante este período de tiempo. Los pings de mantenimiento de conexión se deshabilitan cuando esta opción se establece en TimeSpan.MaxValue. El valor predeterminado es TimeSpan.MaxValue.
  • KeepAlivePingTimeout es un TimeSpan que configura el tiempo de espera de los pings. Si el servidor no recibe ningún fotograma, como un ping de respuesta, durante este tiempo de espera, se cierra la conexión. El tiempo de espera de mantenimiento de conexión se deshabilita cuando esta opción se establece en TimeSpan.MaxValue. El valor predeterminado es 20 segundos.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Otras opciones

E/S síncrona

AllowSynchronousIO controla si se permite la E/S sincrónica para la solicitud y la respuesta. El valor predeterminado es false.

Advertencia

Un gran número de operaciones de E/S sincrónicas de bloqueo puede dar lugar al colapso del grupo de subprocesos, lo que hace que la aplicación no responda. Habilite solo AllowSynchronousIO al usar una biblioteca que no admite la E/S asincrónica.

En el ejemplo siguiente se habilita la E/S sincrónica:

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

Para más información sobre otras opciones y límites de Kestrel, vea: