新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

我们很高兴宣布通过.NET对gRPC-Web的实验性支持。gRPC-Web允许您从基于浏览器的应用程序(例如JavaScript SPA或Blazor WebAssembly应用程序)调用gRPC。

.NET的gRPC-Web承诺为浏览器应用程序带来许多出色的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组装应用程序
  • 在IIS和Azure应用程序服务中托管ASP.NET Core gRPC应用程序。某些服务器(例如IIS和Azure应用程序服务)当前无法承载gRPC服务。在他们积极致力于这一工作的同时,gRPC-Web提供了一种有趣的替代方案,如今它可以在任何环境下运行。
  • 从.NET Core以外的平台调用gRPC。某些.NET平台HttpClient不支持HTTP / 2。gRPC-Web可用于在这些平台上调用gRPC服务(例如Blazor WebAssembly,Xamarin)。

请注意,gRPC-Web性能低下,并且不再支持两个gRPC功能:客户端流和双向流。(仍支持流传输到服务器!)

GRPC-Web服务器说明


如果您尚未在.NET中学习gRPC,则这里有一个  简单的教程,因此您可以开始使用

gRPC-Web不需要对服务进行任何更改,唯一的修改是初始配置。要使用ASP.NET Core gRPC服务启用gRPC-Web,请将链接添加到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客户端说明


该GRPC的Web JavaScript客户端具有指令  用于设置GRPC的Web客户端的JavaScript的浏览器SPA利用。

使用.NET客户端调用gRPC-Web类似于常规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" });

要查看运行.NET的gRPC-Web,请阅读我们在Blazor WebAssembly中使用gRPC-Web的同事的最酷的博客文章 

立即尝试使用带有ASP.NET Core的gRPC-Web


在NuGet上预览软件包:


您可以在此处找到有关将gRPC-Web与.NET Core一起使用的文档 

注意:虽然gRPC-Web for .NET只是一个试验项目,而不是受支持的产品。

Source: https://habr.com/ru/post/undefined/


All Articles