Usar o cliente gRPC com o .NET Standard 2.0

Por James Newton-King

Este artigo discute como usar o cliente gRPC do .NET com implementações do .NET que dão suporte ao .NET Standard 2.0.

Implementações do .NET

As seguintes implementações do .NET (ou posteriores) dão suporte ao Grpc.Net.Client, mas não têm suporte total para HTTP/2:

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

O cliente .NET gRPC pode chamar serviços dessas implementações do .NET com alguma configuração adicional.

Configuração do HttpHandler

Um provedor HTTP deve ser configurado usando GrpcChannelOptions.HttpHandler. Se um manipulador não estiver configurado, um erro será gerado:

System.PlatformNotSupportedException: gRPC requer configuração extra para fazer chamadas RPC com êxito em implementações do .NET que não têm suporte para gRPC por HTTP/2. Um provedor HTTP deve ser especificado usando GrpcChannelOptions.HttpHandler. O provedor HTTP configurado deve dar suporte a HTTP/2 ou ser configurado para usar gRPC-Web.

Implementações do .NET que não dão suporte a HTTP/2, como UWP, Xamarin e Unity, podem 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" });

Os clientes também podem ser criados usando a fábrica de clientes gRPC. Um provedor HTTP é configurado usando o método de extensão ConfigurePrimaryHttpMessageHandler.

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

Para saber mais, confira Configurar gRPC-Web com o cliente gRPC do .NET.

Importante

O gRPC-Web requer que o cliente e o servidor sejam compatíveis com ele. O gRPC-Web pode ser configurado rapidamente por um servidor gRPC do ASP.NET Core. Outras implementações de servidor gRPC exigem um proxy para dar suporte a gRPC-Web.

.NET Framework

.NET Framework tem suporte limitado para gRPC por HTTP/2. Para habilitar o gRPC por HTTP/2 no .NET Framework, configure o canal para usar WinHttpHandler.

Requisitos e restrições para usar WinHttpHandler:

  • Windows 11 ou posterior, Windows Server 2019 ou posterior.
    • O cliente gRPC tem suporte total no Windows 11 ou posterior.
    • O cliente gRPC tem suporte parcial no Windows Server 2019 e no Windows Server 2022. Há suporte para métodos de streaming unário e de servidor. Não há suporte para métodos de streaming bidirecional e de cliente.
  • Uma referência a System.Net.Http.WinHttpHandler versão 6.0.1 ou posterior.
  • Configure WinHttpHandler no canal usando GrpcChannelOptions.HttpHandler.
  • .NET Framework 4.6.1 ou versões posteriores.
  • Há suporte apenas para chamadas gRPC por 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 principal de C# do gRPC

Uma opção alternativa para .NET Framework e Xamarin foi usar a biblioteca principal do gRPC C# para fazer chamadas gRPC. A biblioteca principal de C# do gRPC é:

  • Uma biblioteca de terceiros que dá suporte à realização de chamadas gRPC por HTTP/2 no .NET Framework e no Xamarin.
  • Sem suporte pela Microsoft.
  • No modo de manutenção e será preterido em favor do gRPC para .NET.
  • Não recomendado para novos aplicativos.

Recursos adicionais