Layanan gRPC dengan C#
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Dokumen ini menguraikan konsep yang diperlukan untuk menulis aplikasi gRPC di C#. Topik yang dibahas di sini berlaku untuk aplikasi gRPC berbasis C-core dan ASP.NET Core.
file proto
gRPC menggunakan pendekatan yang mengutamakan kontrak untuk pengembangan API. Buffer protokol (protobuf) digunakan sebagai Bahasa Definisi Antarmuka (IDL) secara default. File .proto
berisi:
- Definisi layanan gRPC.
- Pesan yang dikirim antara klien dan server.
Untuk informasi selengkapnya tentang sintaks file protobuf, lihat Membuat pesan Protobuf untuk aplikasi .NET.
Misalnya, pertimbangkan file greet.proto yang digunakan di Memulai layanan gRPC:
Greeter
Menentukan layanan.- Layanan
Greeter
mendefinisikanSayHello
panggilan. SayHello
HelloRequest
mengirim pesan dan menerimaHelloReply
pesan:
syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
Jika Anda ingin melihat komentar kode yang diterjemahkan ke bahasa selain bahasa Inggris, beri tahu kami dalam masalah diskusi GitHub ini.
.proto
Menambahkan file ke aplikasi C#
File .proto
disertakan dalam proyek dengan menambahkannya ke <Protobuf>
grup item:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Secara default, <Protobuf>
referensi menghasilkan klien konkret dan kelas dasar layanan. Atribut elemen GrpcServices
referensi dapat digunakan untuk membatasi pembuatan aset C#. Opsi yang valid GrpcServices
adalah:
Both
(default saat tidak ada)Server
Client
None
Dukungan Alat C# untuk file .proto
Paket alat Grpc.Tools diperlukan untuk menghasilkan aset C# dari .proto
file. Aset yang dihasilkan (file):
- Dihasilkan sesuai kebutuhan setiap kali proyek dibangun.
- Tidak ditambahkan ke proyek atau diperiksa ke kontrol sumber.
- Adalah artefak build yang terkandung dalam direktori obj .
Paket ini diperlukan oleh proyek server dan klien. Metapackage Grpc.AspNetCore
mencakup referensi ke Grpc.Tools
. Proyek server dapat menambahkan Grpc.AspNetCore
menggunakan Manajer Paket di Visual Studio atau dengan menambahkan <PackageReference>
ke file proyek:
<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
Proyek klien harus langsung mereferensikan Grpc.Tools
bersama paket lain yang diperlukan untuk menggunakan klien gRPC. Paket peralatan tidak diperlukan saat runtime, sehingga dependensi ditandai dengan PrivateAssets="All"
:
<PackageReference Include="Google.Protobuf" Version="3.18.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
<PackageReference Include="Grpc.Tools" Version="2.40.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Aset C# yang dihasilkan
Paket alat menghasilkan jenis C# yang mewakili pesan yang ditentukan dalam file yang disertakan .proto
.
Untuk aset sisi server, jenis dasar layanan abstrak dihasilkan. Jenis dasar berisi definisi semua panggilan gRPC yang terkandung dalam .proto
file. Buat implementasi layanan konkret yang berasal dari jenis dasar ini dan terapkan logika untuk panggilan gRPC. greet.proto
Untuk , contoh yang dijelaskan sebelumnya, jenis abstrak GreeterBase
yang berisi metode virtual SayHello
dihasilkan. Implementasi GreeterService
konkret mengambil alih metode dan mengimplementasikan logika penanganan panggilan gRPC.
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
Untuk aset sisi klien, jenis klien konkret dihasilkan. Panggilan gRPC dalam file diterjemahkan .proto
ke dalam metode pada jenis beton, yang dapat dipanggil. greet.proto
Untuk , contoh yang dijelaskan sebelumnya, jenis beton GreeterClient
dihasilkan. Panggil GreeterClient.SayHelloAsync
untuk memulai panggilan gRPC ke server.
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Secara default, aset server dan klien dihasilkan untuk setiap .proto
file yang disertakan <Protobuf>
dalam grup item. Untuk memastikan hanya aset server yang dihasilkan dalam proyek server, GrpcServices
atribut diatur ke Server
.
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Demikian pula, atribut diatur ke Client
dalam proyek klien.
Sumber Daya Tambahan:
Dokumen ini menguraikan konsep yang diperlukan untuk menulis aplikasi gRPC di C#. Topik yang dibahas di sini berlaku untuk aplikasi gRPC berbasis C-core dan ASP.NET Core.
file proto
gRPC menggunakan pendekatan yang mengutamakan kontrak untuk pengembangan API. Buffer protokol (protobuf) digunakan sebagai Bahasa Definisi Antarmuka (IDL) secara default. File .proto
berisi:
- Definisi layanan gRPC.
- Pesan yang dikirim antara klien dan server.
Untuk informasi selengkapnya tentang sintaks file protobuf, lihat Membuat pesan Protobuf untuk aplikasi .NET.
Misalnya, pertimbangkan file greet.proto yang digunakan di Memulai layanan gRPC:
Greeter
Menentukan layanan.- Layanan
Greeter
mendefinisikanSayHello
panggilan. SayHello
HelloRequest
mengirim pesan dan menerimaHelloReply
pesan:
syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
Jika Anda ingin melihat komentar kode yang diterjemahkan ke bahasa selain bahasa Inggris, beri tahu kami dalam masalah diskusi GitHub ini.
.proto
Menambahkan file ke aplikasi C#
File .proto
disertakan dalam proyek dengan menambahkannya ke <Protobuf>
grup item:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Secara default, <Protobuf>
referensi menghasilkan klien konkret dan kelas dasar layanan. Atribut elemen GrpcServices
referensi dapat digunakan untuk membatasi pembuatan aset C#. Opsi yang valid GrpcServices
adalah:
Both
(default saat tidak ada)Server
Client
None
Dukungan Alat C# untuk file .proto
Paket alat Grpc.Tools diperlukan untuk menghasilkan aset C# dari .proto
file. Aset yang dihasilkan (file):
- Dihasilkan sesuai kebutuhan setiap kali proyek dibangun.
- Tidak ditambahkan ke proyek atau diperiksa ke kontrol sumber.
- Adalah artefak build yang terkandung dalam direktori obj .
Paket ini diperlukan oleh proyek server dan klien. Metapackage Grpc.AspNetCore
mencakup referensi ke Grpc.Tools
. Proyek server dapat menambahkan Grpc.AspNetCore
menggunakan Manajer Paket di Visual Studio atau dengan menambahkan <PackageReference>
ke file proyek:
<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" />
Proyek klien harus langsung mereferensikan Grpc.Tools
bersama paket lain yang diperlukan untuk menggunakan klien gRPC. Paket peralatan tidak diperlukan saat runtime, sehingga dependensi ditandai dengan PrivateAssets="All"
:
<PackageReference Include="Google.Protobuf" Version="3.11.4" />
<PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
<PackageReference Include="Grpc.Tools" Version="2.28.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Aset C# yang dihasilkan
Paket alat menghasilkan jenis C# yang mewakili pesan yang ditentukan dalam file yang disertakan .proto
.
Untuk aset sisi server, jenis dasar layanan abstrak dihasilkan. Jenis dasar berisi definisi semua panggilan gRPC yang terkandung dalam .proto
file. Buat implementasi layanan konkret yang berasal dari jenis dasar ini dan terapkan logika untuk panggilan gRPC. greet.proto
Untuk , contoh yang dijelaskan sebelumnya, jenis abstrak GreeterBase
yang berisi metode virtual SayHello
dihasilkan. Implementasi GreeterService
konkret mengambil alih metode dan mengimplementasikan logika penanganan panggilan gRPC.
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
Untuk aset sisi klien, jenis klien konkret dihasilkan. Panggilan gRPC dalam file diterjemahkan .proto
ke dalam metode pada jenis beton, yang dapat dipanggil. greet.proto
Untuk , contoh yang dijelaskan sebelumnya, jenis beton GreeterClient
dihasilkan. Panggil GreeterClient.SayHelloAsync
untuk memulai panggilan gRPC ke server.
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
Secara default, aset server dan klien dihasilkan untuk setiap .proto
file yang disertakan <Protobuf>
dalam grup item. Untuk memastikan hanya aset server yang dihasilkan dalam proyek server, GrpcServices
atribut diatur ke Server
.
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Demikian pula, atribut diatur ke Client
dalam proyek klien.
Sumber Daya Tambahan:
ASP.NET Core