1. 程式人生 > >一個新實驗:使用gRPC-Web從瀏覽器呼叫.NET gRPC服務

一個新實驗:使用gRPC-Web從瀏覽器呼叫.NET gRPC服務

今天給大家翻譯一篇由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客戶端,以及一個用於在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上的預覽包:

  • Grpc.AspNetCore.Web –將gRPC-Web支援新增到ASP.NET Core gRPC服務。
  • 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://devblogs.microsoft.com/aspnet/grpc-web-experiment/

原文作者:James Newton-King

翻譯作者:依樂祝