Uso del cliente gRPC con .NET Standard 2.0

Por James Newton-King

En este artículo se describe cómo usar el cliente gRPC para .NET con implementaciones de .NET que admiten .NET Standard 2.0.

Implementaciones de .NET

Las siguientes implementaciones de .NET (o versiones posteriores) admiten Grpc.Net.Client, pero no son totalmente compatibles con HTTP/2:

  • .NET Core 2.1
  • .NET Framework 4.6.1
  • Mono 5.4
  • Xamarin.iOS 10.14
  • Xamarin.Android 8.0
  • Plataforma universal de Windows 10.0.16299
  • Unity 2018.1

El cliente gRPC para .NET puede llamar a los servicios de dichas implementaciones de .NET con algunas opciones de configuración adicionales.

Configuración de HttpHandler

Es necesario configurar un proveedor HTTP con GrpcChannelOptions.HttpHandler. Si algún controlador no se configura, se generará un error:

System.PlatformNotSupportedException: gRPC requiere algunas opciones de configuración adicionales para poder realizar correctamente las llamadas de RPC en implementaciones de .NET que no admitan gRPC mediante HTTP/2. Es necesario especificar un proveedor HTTP con GrpcChannelOptions.HttpHandler. El proveedor HTTP configurado debe admitir HTTP/2 o estar configurado para usar gRPC-Web.

Las implementaciones de .NET que no admitan HTTP/2, como UWP, Xamarin y Unity, pueden usar gRPC-Web como alternativa.

var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

Los clientes también se pueden crear mediante la fábrica de cliente de gRPC. Un proveedor HTTP se configura mediante el método de extensión ConfigurePrimaryHttpMessageHandler.

builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

Para obtener más información, consulte Configuración de gRPC-Web con el cliente gRPC de .NET.

Importante

gRPC-Web requiere que el cliente y el servidor lo admitan. gRPC-Web se puede configurar rápidamente mediante un servidor gRPC de ASP.NET Core. Otras implementaciones del servidor gRPC requieren un proxy para admitir gRPC-Web.

.NET Framework

La compatibilidad de .NET Framework con gRPC por medio de HTTP/2 es limitada. Para habilitar gRPC por medio de HTTP/2 en .NET Framework, configure el canal para usar WinHttpHandler.

Requisitos y restricciones referentes al uso de WinHttpHandler:

  • Windows 11 o posterior; Windows Server 2019 o posterior.
    • El cliente gRPC es totalmente compatible con Windows 11 o posterior.
    • El cliente gRPC se admite parcialmente en Windows Server 2019 y Windows Server 2022. Se admiten métodos de flujos de servidores y unarios. No se admiten métodos de flujo bidireccionales y de cliente.
  • Una referencia a System.Net.Http.WinHttpHandler, versión 6.0.1 o posterior.
  • Configure WinHttpHandler en el canal con GrpcChannelOptions.HttpHandler.
  • .NET Framework 4.6.1 o superior.
  • Solo se admiten llamadas de gRPC por medio de TLS.
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new WinHttpHandler()
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

Biblioteca de gRPC C# core

A la hora de realizar llamadas de gRPC, una alternativa para .NET Framework y Xamarin es usar la biblioteca principal de C# para gRPC. La biblioteca principal de C# para gRPC:

  • Es una biblioteca de terceros que permite realizar llamadas de gRPC por medio de HTTP/2 en .NET Framework y Xamarin.
  • No es compatible con Microsoft.
  • Está en modo de mantenimiento y dejará de utilizarse en favor de gRPC para .NET.
  • No se recomienda para las aplicaciones nuevas.

Recursos adicionales