將 gRPC 從 C-core 移轉至適用於 .NET 的 gRPC
注意
這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支援原則。 如需目前版本,請參閱本文的 .NET 8 版本。
由於基礎堆疊的實作,並非所有功能都能在 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.AspNetCore
:服務由 ASP.NET Core 裝載。 如需伺服器組態資訊,請參閱使用 ASP.NET Core 的 gRPC 服務。Grpc.Net.Client
:用戶端使用GrpcChannel
,其在內部使用內建於 .NET 的網路功能。 如需用戶端組態資訊,請參閱使用 .NET 用戶端呼叫 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_length
和 grpc.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。