將 gRPC 從 C-core 移轉至適用於 .NET 的 gRPC

由於基礎堆疊的實作,並非所有功能都能在 C-core 型 gRPC 應用程式與適用於 .NET 的 gRPC 之間以相同的方式運作。 本文件重點說明兩個堆疊之間移轉的主要差異。

重要

gRPC C-core 處於維護模式,並將取代為適用於 .NET 的 gRPC。 不建議針對新的應用程式使用 gRPC C-core。

平台支援

gRPC C-core 與適用於 .NET 的 gRPC 具有不同的平台支援:

  • gRPC C-core:具備自己的 TLS 和 HTTP/2 堆疊的 C++ gRPC 實作。 Grpc.Core 套件是 gRPC C-core 的 .NET 包裝函式,包含 gRPC 用戶端和伺服器。 其支援 .NET Framework、.NET Core 及 .NET 5 或更新版本。
  • 適用於 .NET 的 gRPC:專為 .NET Core 3.x 和 .NET 5 或更新版本所設計。 其使用新式 .NET 版本中內建的 TLS 和 HTTP/2 堆疊。 Grpc.AspNetCore 套件包含 gRPC 伺服器,該伺服器裝載於 ASP.NET Core 中,須使用 .NET Core 3.x 或者 .NET 5 或更新版本。 Grpc.Net.Client 套件則包含 gRPC 用戶端。 Grpc.Net.Client 中的用戶端對使用 WinHttpHandler 的 .NET Framework 其支援有限。

如需詳細資訊,請參閱 .NET 上的 gRPC 支援的平台

設定伺服器和通道

從 gRPC C-Core 移轉至適用於 .NET 的 gRPC 時,必須修改 NuGet 套件、組態和啟動程式碼。

適用於 .NET 的 gRPC 為其用戶端和伺服器提供了個別的 NuGet 套件。 新增的套件取決於應用程式是裝載 gRPC 服務還是呼叫這些服務:

移轉完成時,應該從應用程式中移除 Grpc.Core 套件。 Grpc.Core 包含大型原生二進位檔案,而移除套件可縮短 NuGet 還原時間並減少應用程式大小。

程式碼產生的服務和用戶端

gRPC C-Core 與適用於 .NET 的 gRPC 共用許多 API,而從 .proto 檔案產生的程式碼與這兩種 gRPC 實作相容。 大部分的用戶端和服務都可以從 C-Core 移轉到適用於 .NET 的 gRPC,而不需要進行變更。

gRPC 服務實作存留期

在 ASP.NET Core 堆疊中,建立的 gRPC 服務預設具有限定範圍的存留期。 相反地,gRPC C-core 預設會繫結至具有單一資料庫存留期的服務。

限定範圍的存留期可讓服務實作解析具有限定範圍存留期的其他服務。 例如,限定範圍的存留期也可以透過建構函式插入從 DI 容器解析 DbContext。 使用限定範圍的存留期:

  • 為每個要求建構服務實作的新執行個體。
  • 無法透過實作類型上的執行個體成員在要求之間共用狀態。
  • 預期是在 DI 容器的單一資料庫服務中儲存共用狀態。 儲存的共用狀態會在 gRPC 服務實作的建構函式中解析。

如需服務存留期的詳細資訊,請參閱在 ASP.NET Core 中插入相依性

新增單一資料庫服務

為了加速從 gRPC C-core 實作轉換到 ASP.NET Core,可以將服務實作的服務存留期從限定範圍變更為單一資料庫。 這涉及將服務實作的執行個體新增至 DI 容器:

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

不過,具有單一資料庫存留期的服務實作無法再透過建構函式插入解析限定範圍的服務。

設定 gRPC 服務選項

在 C-core 型應用程式中建構伺服器執行個體時,將會使用 ChannelOption 設定 grpc.max_receive_message_lengthgrpc.max_send_message_length 之類的設定。

在 ASP.NET Core 中,gRPC 會透過 GrpcServiceOptions 類型提供組態。 例如,可以透過 AddGrpc 來設定 gRPC 服務的傳入訊息大小上限。 下列範例會將預設的 MaxReceiveMessageSize 從 4 MB 變更為 16 MB:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
    });
}

如需組態的詳細資訊,請參閱適用於 .NET 的 gRPC 組態

記錄

C-core 型應用程式依賴 GrpcEnvironment設定記錄器以進行偵錯。 ASP.NET Core 堆疊透過記錄 API 提供這項功能。 例如,可以透過建構函式插入將記錄器新增至 gRPC 服務:

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

如需 gRPC 記錄和診斷的詳細資訊,請參閱在 .NET 上的 gRPC 中記錄和診斷

HTTPS

C-core 型應用程式透過 Server.Ports 屬性設定 HTTPS。 類似的概念可用來在 ASP.NET Core 中設定伺服器。 例如,Kestrel 使用端點組態來達成此功能。

C-core 型應用程式透過 Server.Ports 屬性設定 HTTPS。 類似的概念可用來在 ASP.NET Core 中設定伺服器。 例如,Kestrel 使用端點組態來達成此功能。

gRPC 攔截器

相較於 C-core 型 gRPC 應用程式中的攔截器,ASP.NET Core 中介軟體提供類似的功能。 ASP.NET Core gRPC 應用程式同時支援這兩者,因此不需要重寫攔截器。

如需這些功能相互比較情況的詳細資訊,請參閱 gRPC 攔截器與中介軟體

在非 ASP.NET Core 專案中裝載 gRPC

C 核心型伺服器可以新增至任何項目類型。 適用於 .NET 伺服器的 gRPC 需要 ASP.NET Core。 ASP.NET Core 通常可用,因為項目檔指定 Microsoft.NET.SDK.Web 為 SDK。

gRPC 伺服器可以藉由新增 <FrameworkReference Include="Microsoft.AspNetCore.App" /> 至專案,裝載至 non-ASP.NET Core 專案。 架構參考會提供 ASP.NET Core API,而且可用來啟動 ASP.NET Core 伺服器。

如需詳細資訊,請參閱 在 non-ASP.NET Core 專案中裝載 gRPC。

其他資源