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. Para obtener más información sobre los interceptores de gRPC, 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
    });
}

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 cómo configurar el 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.
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, consulte 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);
}

Advertencia

ASP.NET Core gRPC tiene requisitos adicionales para su uso con Azure App Service o IIS. Para obtener más información sobre dónde se puede usar gRPC, vea gRPC en plataformas compatibles con .NET.

Recursos adicionales