Рады объявить об экспериментальной поддержке gRPC-Web с .NET. gRPC-Web позволяет вызывать gRPC из приложений на основе браузера, таких как JavaScript SPA или приложений Blazor WebAssembly.

gRPC-Web для .NET обещает привнести многие замечательные функции gRPC в приложения для браузеров:

  • Строго-типизированные кодо-сгенерированные клиенты
  • Компактные сообщения Protobuf
  • Серверный стриминг



Что такое gRPC-Web


Невозможно реализовать спецификацию gRPC HTTP/2 в браузере, потому что нет API браузера с достаточным детальным контролем над HTTP-запросами. gRPC-Web решает эту проблему будучи совместимым с HTTP/1.1 и HTTP/2.

gRPC-Web не является новой технологией. Есть стабильный gRPC-Web JavaScript-клиент, а еще прокси для перевода между gRPC и gRPC-Web для сервисов. Новые экспериментальные пакеты позволяют приложению ASP.NET Core gRPC поддерживать gRPC-Web без прокси-сервера и позволяют клиенту .NET Core gRPC вызывать службы gRPC-Web. (отлично подходит для приложений Blazor WebAssembly!)

Новые возможности с gRPC-Web


  • Вызов приложений ASP.NET Core gRPC из браузера — API браузера не могут вызывать gRPC HTTP/2. gRPC-Web предлагает совместимую альтернативу.
    • JavaScript SPA
    • Приложения .NET Blazor Web Assembly
  • Размещать приложения ASP.NET Core gRPC в IIS и службе приложений Azure. Некоторые серверы, такие как IIS и служба приложений Azure, в настоящее время не могут размещать службы gRPC. В то время как над этим активно работают, gRPC-Web предлагает интересную альтернативу, которая сегодня работает в любой среде.
  • Вызов gRPC с платформ, отличных от .NET Core. Некоторые платформы .NET HttpClient не поддерживают HTTP/2. gRPC-Web может использоваться для вызова сервисов gRPC на этих платформах (например, Blazor WebAssembly, Xamarin).

Обратите внимание, что gRPC-Web требует небольших затрат на производительность, и две функции gRPC больше не поддерживаются: клиентская потоковая передача и двусторонняя потоковая передача. (потоковая передача на сервер все еще поддерживается!)

Серверные инструкции gRPC-Web


Если вы еще не изучали gRPC в .NET, вот простой туториал, чтобы вы могли начать работу.

gRPC-Web не требует каких-либо изменений в ваших службах, единственная модификация — это начальная конфигурация. Чтобы включить gRPC-Web со службой ASP.NET Core gRPC, добавьте ссылку на пакет Grpc.AspNetCore.Web. Настройте приложение для использования gRPC-Web, добавив AddGrpcWeb(...) и UseGrpcWeb() в файле запуска: Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    // Добавьте промежуточное ПО gRPC-Web после маршрутизации и перед эндпоинтами
    app.UseGrpcWeb();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
    });
}

Для вызова gRPC-Web из браузера может потребоваться дополнительная настройка, например, настройка приложения для поддержки CORS.

Клиентские инструкции gRPC-Web


У клиента JavaScript gRPC-Web есть инструкции для настройки клиента gRPC-Web для использования в браузере JavaScript SPA.

Вызов gRPC-Web с клиентом .NET аналогичен обычному gRPC, единственное изменение — это способ создания канала. Чтобы включить gRPC-Web, добавьте ссылку на пакет Grpc.Net.Client.Web. Настройте канал для использования GrpcWebHandler:

// Настройте канал для использования gRPC-Web
var handler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler());
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpClient = new HttpClient(handler)
    });

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

Чтобы увидеть gRPC-Web с .NET в действии прочитайте крутой пост в блоге нашего коллеги, который использовал gRPC-Web в Blazor WebAssembly.

Попробуйте gRPC-Web с ASP.NET Core сегодня


Preview-пакеты на NuGet:


Документацию по использованию gRPC-Web с .NET Core вы можете найти здесь.

Примечание: пока gRPC-Web для .NET является лишь экспериментальным проектом, не поддерживаемым продуктом.