使用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 for services 之間進行轉換代理新的實驗性程序包允許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 

啟動文件

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3     services.AddGrpc();
 4 }
 5 
 6 public void Configure(IApplicationBuilder app)
 7 {
 8     app.UseRouting();
 9 
10     // Add gRPC-Web middleware after routing and before endpoints
11     app.UseGrpcWeb();
12 
13     app.UseEndpoints(endpoints =>
14     {
15         endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
16     });
17 }

從瀏覽器調用gRPC-Web可能需要一些其他配置,例如將應用程序配置為支持CORS。

客戶端gRPC-Web說明

JavaScript的GRPC的Web客戶端的指令用於建立GRPC的Web客戶端瀏覽器的JavaScript的SPA使用。

使用.NET客戶端調用gRPC-Web與常規gRPC相同,唯一的修改是創建通道的方式。要啟用gRPC-Web,請添加對Grpc.Net.Client.Web的引用配置通道以使用GrpcWebHandler

1 // Configure a channel to use gRPC-Web
2 var handler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler());
3 var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
4     {
5         HttpClient = new HttpClient(handler)
6     });
7 
8 var client = Greeter.GreeterClient(channel);
9 var response = await client.SayHelloAsync(new GreeterRequest { Name = ".NET" });

 

要查看運行.NET的gRPC-Web,請花點時間閱讀由Steve Sanderson撰寫的精彩博客,該博客在Blazor WebAssembly中使用gRPC-Web

立即嘗試使用帶有ASP.NET Core的gRPC-Web

預覽包位於NuGet上:

可以在此處找到將gRPC-Web與.NET Core一起使用的文檔

.NET的gRPC-Web是一個實驗性項目,而不是承諾的產品。我們想測試一下我們實現gRPC-Web的方法是否有效,並獲得反饋,與通過代理設置gRPC-Web的傳統方法相比,該方法對.NET開發人員是否有用。請在此處或在https://github.com/grpc/grpc-dotnet添加您的反饋,以確保我們構建出開發人員喜歡並能發揮作用的東西。

謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM