Configuración gRPC para .NET

Configuración de opciones de servicios

Los servicios gRPC se configuran con AddGrpc en Startup.cs. Las opciones de configuración están en el paquete Grpc.AspNetCore.Server.

La tabla siguiente describe las opciones disponibles para configurar los servicios gRPC:

Opción Valor predeterminado Descripción
MaxSendMessageSize null Tamaño máximo de mensaje en bytes que se puede enviar desde el servidor. Al intentar enviar un mensaje que supere el tamaño máximo configurado del mensaje, se produce una excepción. Cuando se establece en null, el tamaño del mensaje es ilimitado.
MaxReceiveMessageSize 4 MB Tamaño máximo de mensaje en bytes que puede recibir el servidor. Si el servidor recibe un mensaje que supere este límite, se produce una excepción. Aumentar este valor permite que el servidor reciba mensajes de mayor tamaño, pero puede afectar negativamente al consumo de memoria. Cuando se establece en null, el tamaño del mensaje es ilimitado.
EnableDetailedErrors false Si es true, los mensajes de excepción detallados se devuelven a los clientes cuando se produzca una excepción en un método de servicio. De manera predeterminada, es false. Si se establece EnableDetailedErrors en true, se puede perder información confidencial.
CompressionProviders gzip Colección de proveedores de compresión usados para comprimir y descomprimir mensajes. Los proveedores personalizados de compresión se pueden crear y agregar a la colección. Los proveedores configurados de forma predeterminada admiten la compresión gzip.
ResponseCompressionAlgorithm null Algoritmo de compresión que se usa para comprimir los mensajes enviados desde el servidor. El algoritmo debe coincidir con un proveedor de compresión en CompressionProviders. Para que el algoritmo pueda comprimir una respuesta, el cliente debe indicar que es compatible con el algoritmo enviándola en el encabezado grpc-accept-encoding.
ResponseCompressionLevel null Nivel de compresión utilizado para comprimir los mensajes enviados desde el servidor.
Interceptors None Colección de interceptores que se ejecutan con cada llamada a gRPC. Los interceptores se ejecutan en el orden en que se registran. Los interceptores configurados globalmente se ejecutan antes que los interceptores configurados para un servicio único.

Los interceptores tienen una duración por solicitud de forma predeterminada. Se llama al constructor del interceptor y los parámetros se resuelven a partir de la inserción de dependencia (DI). Un tipo de interceptor también se puede registrar con DI para invalidar cómo se crea y su duración.

Los interceptores ofrecen funcionalidades similares en comparación con el middleware de ASP.NET Core. Para obtener más información, vea Interceptores de gRPC frente a middleware.
IgnoreUnknownServices false Si es true, las llamadas a servicios y métodos desconocidos no devuelven el estado UNIMPLEMENTED y la solicitud pasa al siguiente middleware registrado en ASP.NET Core.

Las opciones se pueden configurar para todos los servicios proporcionando un delegado de opciones a la llamada AddGrpc en Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.EnableDetailedErrors = true;
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

Las opciones de un servicio único invalidan las opciones globales proporcionadas en AddGrpc y se pueden configurar mediante AddServiceOptions<TService>:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc().AddServiceOptions<MyService>(options =>
    {
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

Los interceptores de servicio tienen una duración por solicitud de forma predeterminada. El registro del tipo de interceptor con DI invalida cómo se crea un interceptor y su duración.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
    services.AddSingleton<LoggingInterceptor>();
}

Opciones de servidor de ASP.NET Core

Grpc.AspNetCore.Server está hospedado por un servidor web de ASP.NET Core. Hay una serie de opciones para los servidores de ASP.NET Core, como Kestrel, IIS y HTTP.sys. Cada servidor ofrece opciones adicionales para la forma en la que se procesan las solicitudes HTTP.

El servidor utilizado por una aplicación de ASP.NET Core está configurado en el código de inicio de la aplicación. El servidor predeterminado es Kestrel.

Para obtener más información sobre los distintos servidores y sus opciones de configuración, consulte lo siguiente:

Configuración de opciones de cliente

La configuración de cliente gRPC se establece en GrpcChannelOptions. Las opciones de configuración están en el paquete Grpc.Net.Client.

En la tabla siguiente se describen las opciones disponibles para configurar los canales gRPC:

Opción Valor predeterminado Descripción
HttpHandler Nueva instancia El elemento HttpMessageHandler que se usa para realizar llamadas gRPC. Se puede establecer un cliente para configurar un elemento HttpClientHandler personalizado o agregar controladores adicionales a la canalización HTTP para llamadas gRPC. Si no se especifica ningún elemento HttpMessageHandler, se creará una nueva instancia de HttpClientHandler para el canal con eliminación automática.
HttpClient null El elemento HttpClient que se usa para realizar llamadas gRPC. Este valor es una alternativa a HttpHandler.
DisposeHttpClient false Si se establece en true y se especifica un elemento HttpMessageHandler o HttpClient, el elemento HttpHandler o el elemento HttpClient respectivo se eliminará al eliminarse el elemento GrpcChannel.
LoggerFactory null El elemento LoggerFactory que usa el cliente para registrar información acerca de las llamadas gRPC. Una instancia de LoggerFactory se puede resolver a partir de la inserción de dependencia o crearse mediante LoggerFactory.Create. Para obtener ejemplos de configuración del registro, vea Registro y diagnóstico en gRPC en .NET.
MaxSendMessageSize null Tamaño máximo de mensaje en bytes que se puede enviar desde el cliente. Al intentar enviar un mensaje que supere el tamaño máximo configurado del mensaje, se produce una excepción. Cuando se establece en null, el tamaño del mensaje es ilimitado.
MaxReceiveMessageSize 4 MB Tamaño máximo de mensaje en bytes que puede recibir el cliente. Si el cliente recibe un mensaje que supere este límite, se produce una excepción. Aumentar este valor permite que el cliente reciba mensajes de mayor tamaño, pero puede afectar negativamente al consumo de memoria. Cuando se establece en null, el tamaño del mensaje es ilimitado.
Credentials null Instancia de ChannelCredentials. Las credenciales se usan para agregar metadatos de autenticación a llamadas gRPC.
CompressionProviders gzip Colección de proveedores de compresión usados para comprimir y descomprimir mensajes. Los proveedores personalizados de compresión se pueden crear y agregar a la colección. Los proveedores configurados de forma predeterminada admiten la compresión gzip.
ThrowOperationCanceledOnCancellation false Si se establece en true, los clientes inician OperationCanceledException cuando se cancela una llamada o se supera su fecha límite.
UnsafeUseInsecureChannelCallCredentials false Si se establece en true, CallCredentials se aplican a las llamadas gRPC realizadas por un canal no seguro. El envío de encabezados de autenticación a través de una conexión no segura tiene implicaciones de seguridad y no debe realizarse en entornos de producción.
MaxRetryAttempts 5 Número máximo de reintentos. Este valor limita los valores de cualquier intento y reintento de cobertura especificados en la configuración del servicio. Establecer este valor como independiente no permite los reintentos. Los reintentos se habilitan en la configuración del servicio, mediante ServiceConfig. Un valor null elimina el límite máximo de reintentos. Para obtener más información sobre los reintentos, vea Control de errores transitorios con reintentos de gRPC.
MaxRetryBufferSize 16 MB Tamaño de búfer máximo en bytes que se puede utilizar para almacenar mensajes enviados durante reintentos o llamadas de cobertura. Si se supera el límite de búfer, no se realizarán más reintentos y se cancelarán todas las llamadas de cobertura excepto una. Este límite se aplica a todas las llamadas realizadas mediante el canal. Un valor null elimina el límite máximo de reintentos del tamaño de búfer.
MaxRetryBufferPerCallSize 1 MB Tamaño de búfer máximo en bytes que se puede utilizar para almacenar mensajes enviados durante reintentos o llamadas de cobertura. Si se supera el límite de búfer, no se realizarán más reintentos y se cancelarán todas las llamadas de cobertura excepto una. Este límite se aplica a una llamada. Un valor null elimina el límite máximo de reintentos del tamaño de búfer por llamada.
ServiceConfig null Configuración del servicio de un canal de gRPC. Una configuración de servicio se puede usar para configurar reintentos de gRPC.

El código siguiente:

  • Establece el tamaño máximo de mensaje de envío y recepción en el canal.
  • Crea un cliente.
static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
        MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
    });
    var client = new Greeter.GreeterClient(channel);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

Tenga en cuenta que los interceptores de cliente no están configurados con GrpcChannelOptions. En su lugar, los interceptores de cliente se configuran mediante el método de extensión Intercept con un canal. El método de extensión está en el espacio de nombres Grpc.Core.Interceptors.

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var callInvoker = channel.Intercept(new LoggingInterceptor());
    var client = new Greeter.GreeterClient(callInvoker);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

Opciones del controlador System.Net

Grpc.Net.Client usa un transporte HTTP derivado de HttpMessageHandler para efectuar solicitudes HTTP. Cada controlador ofrece opciones adicionales para la forma en la que se efectúan las solicitudes HTTP.

El controlador se configura en un canal y se puede invalidar estableciendo GrpcChannelOptions.HttpHandler. .NET Core 3 y .NET 5 o versiones posteriores utilizan SocketsHttpHandler de forma predeterminada. Las aplicaciones cliente gRPC en .NET Framework deben configurar WinHttpHandler.

Para obtener más información sobre los distintos controladores y sus opciones de configuración, consulte lo siguiente:

Recursos adicionales