Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Note
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Warning
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Tento článek obsahuje přehled konceptů potřebných k psaní aplikací gRPC v jazyce C#. Uvedené informace platí pro aplikace gRPC založené na C i ASP.NET Core.
Kontrola souboru .proto
V gRPC se při vývoji rozhraní API používá přístup založený na kontraktech. Protocol Buffers (protobuf) se ve výchozím nastavení používají jako Interface Definition Language (IDL). Soubor .proto obsahuje:
- Definice služby gRPC.
- Zprávy odeslané mezi klienty a servery.
Další informace o syntaxi souborů protobuf naleznete v tématu Vytváření zpráv Protobuf pro aplikace .NET.
Zvažte soubor greet.proto použitý v kurzu Vytvoření klienta a serveru gRPC v ASP.NET Core:
- Soubor definuje
Greeterslužbu. - Služba
GreeterdefinujeSayHellovolání. - Volání
SayHelloodešleHelloRequestzprávu a obdržíHelloReplyzprávu.
Soubor obsahuje následující kód:
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;
}
Přidání souboru .proto do aplikace v jazyce C#
Soubor .proto je součástí projektu tak, že ho přidáte <Protobuf> do skupiny položek:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Ve výchozím nastavení <Protobuf> odkaz generuje konkrétního klienta a základní třídu služby. Atribut prvku GrpcServices lze použít k omezení generování prostředků v C#. Platné GrpcServices možnosti jsou:
-
Both(výchozí hodnota, pokud není k dispozici) ServerClientNone
Podpora nástrojů jazyka C# pro soubory .proto
Balíček nástrojů Grpc.Tools je nutný k vygenerování prostředků jazyka C# ze souborů .proto .
Vygenerované prostředky (soubory) mají následující charakteristiky:
- Při každém sestavení projektu se vygenerují podle potřeby.
- Nepřidávají se do projektu ani se nezapisují do správy verzí.
- Jedná se o artefakt sestavení, který se nachází v adresáři obj.
Serverové i klientské projekty vyžadují tento balíček. Metapackage Grpc.AspNetCore obsahuje odkaz na Grpc.Tools. Serverové projekty mohou přidat Grpc.AspNetCore pomocí Správce balíčků v Visual Studio nebo přidáním <PackageReference> do souboru projektu:
<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
Klientské projekty by měly přímo odkazovat Grpc.Tools společně s ostatními balíčky potřebnými k použití klienta gRPC. Balíček nástrojů se nevyžaduje za běhu, takže závislost je označená PrivateAssets="All" nastavením:
<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>
Generované soubory jazyka C#
Balíček nástrojů generuje typy jazyka C# představující zprávy definované v zahrnutých souborech .proto .
U prostředků na straně serveru se vygeneruje abstraktní základní typ služby. Základní typ obsahuje definice všech volání gRPC obsažených v souboru .proto . Vytvořte konkrétní implementaci služby, která je odvozena od tohoto základního typu, a implementuje logiku pro volání gRPC. Pro soubor greet.proto použitý v předchozím příkladu se vygeneruje abstraktní GreeterBase typ, který obsahuje virtuální SayHello metodu. Konkrétní implementace GreeterService přepíše metodu a implementuje logiku, která zpracovává volání 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
});
}
}
U prostředků na straně klienta se vygeneruje konkrétní typ klienta. Volání gRPC v souboru .proto jsou přeložena do metod konkrétního typu, které lze volat. Pro soubor greet.proto použitý v předchozím příkladu se vygeneruje konkrétní GreeterClient typ. Volání GreeterClient.SayHelloAsync pro zahájení volání gRPC na 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();
Ve výchozím nastavení jsou prostředky serveru a klienta generovány pro každý soubor .proto zahrnutý ve <Protobuf> skupině prvků. Aby se v projektu serveru generovaly pouze prostředky serveru, je atribut GrpcServices nastaven na hodnotu Server.
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Podobně je atribut nastaven na Client v klientských projektech.
Související obsah
Tento dokument popisuje koncepty potřebné k psaní aplikací gRPC v jazyce C#. Tato témata se týkají aplikací GRPC založených na jádrech C i ASP.NET Core.
soubor proto
V gRPC se při vývoji rozhraní API používá přístup založený na kontraktech. Protocol Buffers (protobuf) se ve výchozím nastavení používají jako Interface Definition Language (IDL). Soubor .proto obsahuje:
- Definice služby gRPC.
- Zprávy odeslané mezi klienty a servery.
Další informace o syntaxi souborů protobuf naleznete v tématu Vytváření zpráv Protobuf pro aplikace .NET.
Představte si například soubor greet.proto použitý ve službě Začínáme se službou gRPC:
- Definuje
Greeterslužbu. - Služba
GreeterdefinujeSayHellovolání. -
SayHelloHelloRequestodešle zprávu a obdržíHelloReplyzprávu:
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;
}
.proto Přidání souboru do aplikace v jazyce C#
Soubor .proto je součástí projektu tak, že ho přidáte <Protobuf> do skupiny položek:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Ve výchozím nastavení <Protobuf> odkaz generuje konkrétního klienta a základní třídu služby. Atribut prvku GrpcServices lze použít k omezení generování prostředků v C#. Platné GrpcServices možnosti jsou:
-
Both(výchozí hodnota, pokud není k dispozici) ServerClientNone
Podpora nástrojů jazyka C# pro soubory .proto
K vygenerování prostředků jazyka C# ze souborů se vyžaduje balíček .proto. Vygenerovaná aktiva (vytvořené soubory):
- Generují se podle potřeby při každém sestavení projektu.
- Nejsou přidány do projektu ani uloženy do systému správy verzí.
- Jedná se o artefakt sestavení obsažený v adresáři obj .
Tento balíček vyžaduje jak serverové, tak klientské projekty. Metapackage Grpc.AspNetCore obsahuje odkaz na Grpc.Tools. Projekty serveru můžou přidat Grpc.AspNetCore pomocí Správce balíčků v sadě Visual Studio nebo přidáním <PackageReference> souboru projektu:
<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" />
Klientské projekty by měly přímo odkazovat Grpc.Tools společně s ostatními balíčky potřebnými k použití klienta gRPC. Balíček nástrojů se nevyžaduje za běhu, takže závislost je označena jako 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>
Generované soubory jazyka C#
Balíček nástrojů generuje typy jazyka C# představující zprávy definované v zahrnutých .proto souborech.
U prostředků na straně serveru se vygeneruje abstraktní základní typ služby. Základní typ obsahuje definice všech volání gRPC obsažených .proto v souboru. Vytvořte konkrétní implementaci služby, která je odvozena od tohoto základního typu, a implementuje logiku pro volání gRPC. V příkladu greet.protopopsaném výše se vygeneruje abstraktní GreeterBase typ, který obsahuje virtuální SayHello metodu. Konkrétní implementace GreeterService přepíše metodu a implementuje logiku, která zpracovává volání 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
});
}
}
U prostředků na straně klienta se vygeneruje konkrétní typ klienta. Volání gRPC v .proto souboru jsou přeložena do metod konkrétního typu, které lze volat. V příkladu greet.protopopsaném výše se vygeneruje konkrétní GreeterClient typ. Volání GreeterClient.SayHelloAsync pro zahájení volání gRPC na 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();
}
Ve výchozím nastavení se pro každý .proto soubor zahrnutý ve <Protobuf> skupině položek vygenerují prostředky serveru a klienta. Aby se v projektu serveru generovaly pouze prostředky serveru, je atribut GrpcServices nastaven na hodnotu Server.
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Podobně je atribut nastaven na Client v klientských projektech.