今天给大家翻译一篇由 ASP.NET 首席开发工程师 James Newton-King 前几天发表的一篇博客, 文中带来了一个实验性的产品 gRPC-web. 大家可以点击文末的讨论帖进行相关反馈. 我会在文章末尾给出原文链接. 全部译文如下:
我很高兴宣布通过. 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 客户端 https://github.com/grpc/grpc-web , 以及一个用于在 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 应用
在 IIS 和 Azure App Service 中托管 ASP.NET Core gRPC 应用程序 - 某些服务器 (例如 IIS 和 Azure App Service) 当前无法托管 gRPC 服务. 在积极研究这一问题的同时, gRPC-Web 提供了一种有趣的替代方案, 可在当今的每个环境中使用.
从非. NET Core 平台调用 gRPC - 一些. NET 平台 HttpClient 不支持 HTTP / 2.gRPC-Web 可用于在这些平台 (例如 Blazor WebAssembly,Xamarin) 上调用 gRPC 服务.
请注意, gRPC-Web 的性能成本较低, 并且不再支持两个 gRPC 功能: 客户端流和双向流.(仍然支持服务端流!)
服务端 gRPC-Web 说明
如果您是. NET 中 gRPC 的新手, 那么这里有一个简单的入门指南.
gRPC-Web 不需要对服务进行任何更改, 唯一的修改是启动配置. 要在 ASP.NET Core gRPC 服务中启用 gRPC-Web, 请添加对 Grpc.AspNetCore.Web 包的引用. 通过在启动文件中添加 AddGrpcWeb(...)和 UseGrpcWeb(), 将应用程序配置为使用 gRPC-Web :
Startup.cs
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddGrpcWeb();
- }
- public void Configure(IApplicationBuilder App)
- {
- App.UseRouting();
- // Add gRPC-Web middleware after routing and before endpoints
- App.UseGrpcWeb();
- App.UseEndpoints(endpoints =>
- {
- endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
- });
- }
从浏览器调用 gRPC-Web 可能需要一些其他配置, 例如将应用程序配置为支持 CORS.
客户端 gRPC-Web 说明
JavaScript 的 gRPC 的 Web 客户端有关于设置 gRPC Web 客户端以在浏览器 JavaScript SPAs 中使用的说明.
使用. NET 客户端调用 gRPC-Web 与常规 gRPC 相同, 唯一的修改是创建通道的方式. 要启用 gRPC-Web, 请添加对 Grpc.NET.Client.Web 包的引用. 配置通道以使用 GrpcWebHandler:
- // Configure a channel to use 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, 请花点时间阅读由 Steve Sanderson 撰写的精彩博客, 该博客在 Blazor WebAssembly 中使用 gRPC-Web.
立即尝试在 ASP.NET Core 中使用 gRPC-Web
NuGet 上的预览包:
https://www.nuget.org/packages/Grpc.AspNetCore.Web - 将 gRPC-Web 支持添加到 ASP.NET Core gRPC 服务.
https://www.nuget.org/packages/Grpc.Net.Client.Web - 在. NET 调用 gRPC-Web 端点
可以在此处找到将 gRPC-Web 与. NET Core 一起使用的文档.
.NET 的 gRPC-Web 是一个实验性项目, 而不是稳定发布的产品. 我们想测试一下我们实现 gRPC-Web 的方法是否有效, 并获得反馈, 与通过代理设置 gRPC-Web 的传统方法相比, 该方法对. NET 开发人员是否有用. 大家可以在 https://github.com/grpc/grpc-dotnet 上添加使用反馈, 以确保我们构建出开发人员喜欢并能发挥作用的东西.
谢谢!
来源: https://www.cnblogs.com/yilezhu/p/12313870.html