Использование клиента gRPC с .NET Standard 2.0

Автор: Джеймс Ньютон-Кинг (James Newton-King)

В этой статье объясняется, как использовать клиент .NET gRPC с реализациями .NET, поддерживающими .NET Standard 2.0.

Реализации .NET

Следующие реализации .NET (или их более поздние версии) поддерживают Grpc.Net.Client, но не обеспечивают полную поддержку HTTP/2:

  • .NET Core 2.1
  • .NET Framework 4.6.1
  • Mono 5.4
  • Xamarin.iOS 10.14
  • Xamarin.Android 8.0;
  • универсальная платформа Windows 10.0.16299.
  • Unity 2018.1.

Клиент .NET gRPC может вызывать службы из этих реализаций .NET, но для этого требуется дополнительная настройка.

Конфигурация HttpHandler

Поставщик HTTP следует настроить с помощью GrpcChannelOptions.HttpHandler. Если обработчик не настроен, возникает ошибка:

System.PlatformNotSupportedException: gRPC требует дополнительной настройки для успешного выполнения вызовов RPC в реализациях .NET, которые не поддерживают gRPC на основе HTTP/2. Поставщик HTTP должен быть указан с использованием GrpcChannelOptions.HttpHandler. Настроенный поставщик HTTP должен поддерживать HTTP/2 или быть настроен для использования gRPC-Web.

Реализации .NET, которые не поддерживают HTTP/2 (такие как UWP, Xamarin и Unity), в качестве альтернативы могут использовать gRPC-Web.

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

Клиенты также могут быть созданы с помощью фабрики клиента gRPC. Поставщик HTTP настраивается с помощью метода расширения ConfigurePrimaryHttpMessageHandler.

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

Дополнительные сведения см. в разделе Настройка gRPC-Web с помощью клиента .NET gRPC.

Важно!

Требуется, чтобы клиент и сервер поддерживали gRPC-Web. gRPC-Web можно быстро настроить на сервере ASP.NET Core gRPC. Для других реализаций сервера gRPC требуется прокси-сервер, чтобы обеспечить поддержку gRPC-Web.

.NET Framework

.NET Framework имеет ограниченную поддержку gRPC на основе HTTP/2. Чтобы включить gRPC на основе HTTP/2 в .NET Framework, настройте канал для использования WinHttpHandler.

Необходимые компоненты для использования WinHttpHandler и ограничения:

  • Windows 11 или более поздней версии, Windows Server 2019 или более поздней версии.
    • Клиент gRPC полностью поддерживается в Windows 11 или более поздней версии.
    • Клиент gRPC частично поддерживается в Windows Server 2019 и Windows Server 2022. Поддерживаются унарные и серверные методы потоковой передачи. Методы потоковой передачи клиента и двунаправленной потоковой передачи не поддерживаются.
  • ссылка на пакет System.Net.Http.WinHttpHandler версии 6.0.1 или более поздней;
  • Настройте WinHttpHandler в канале с помощью GrpcChannelOptions.HttpHandler.
  • .NET Framework 4.6.1 или более поздней версии.
  • поддерживаются только вызовы gRPC через 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" });

gRPC C# core-library

В качестве альтернативы в .NET Framework и Xamarin для вызовов gRPC можно использовать библиотеку core-library gRPC C#. Библиотека core-library gRPC C#:

Дополнительные ресурсы