Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Note
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
W tym dokumencie opisano pojęcia niezbędne do pisania aplikacji gRPC w języku C#. Omówione tutaj tematy dotyczą zarówno aplikacji gRPC opartych na języku C, jak i ASP.NET Core.
plik proto
Usługa gRPC korzysta z podejścia opartego na kontraktach do tworzenia interfejsów API. protokołu (protobuf) są domyślnie używane jako język IDL (Interface Definition Language). Plik .proto zawiera:
- Definicja usługi gRPC.
- Komunikaty wysyłane między klientami i serwerami.
Aby uzyskać więcej informacji na temat składni plików protobuf, zobacz Create Protobuf messages for .NET apps (Tworzenie komunikatów Protobuf dla aplikacji platformy .NET).
Rozważmy na przykład plik greet.proto używany w artykule Wprowadzenie do usługi gRPC:
- Definiuje usługę
Greeter. - Usługa
Greeterdefiniuje wywołanieSayHello. -
SayHelloHelloRequestwysyła wiadomość i odbieraHelloReplykomunikat:
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;
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
.proto Dodawanie pliku do aplikacji w języku C#
Plik .proto znajduje się w projekcie, dodając go do <Protobuf> grupy elementów:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Domyślnie odwołanie <Protobuf> generuje konkretnego klienta i klasę bazową usługi. Atrybut elementu odwołania może służyć do ograniczania generowania GrpcServices zasobów języka C#. Prawidłowe GrpcServices opcje to:
-
Both(wartość domyślna, jeśli nie jest obecna) ServerClientNone
Obsługa narzędzi języka C# dla plików .proto
Pakiet narzędzi Grpc.Tools jest wymagany do generowania zasobów języka C# z .proto plików. Wygenerowane zasoby (pliki):
- Są generowane zgodnie z potrzebami za każdym razem, gdy projekt jest kompilowany.
- Nie są dodawane do projektu ani sprawdzane w kontroli źródła.
- To artefakt kompilacji zawarty w katalogu obj .
Ten pakiet jest wymagany zarówno przez projekty serwera, jak i klienta. Metapakiet Grpc.AspNetCore zawiera odwołanie do Grpc.Tools. Projekty serwera mogą dodawać Grpc.AspNetCore przy użyciu Menedżer pakietów w programie Visual Studio lub dodając element <PackageReference> do pliku projektu:
<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
Projekty klienckie powinny bezpośrednio odwoływać Grpc.Tools się do innych pakietów wymaganych do korzystania z klienta gRPC. Pakiet narzędzi nie jest wymagany w czasie wykonywania, więc zależność jest oznaczona za pomocą polecenia 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>
Wygenerowane zasoby języka C#
Pakiet narzędzi generuje typy języka C# reprezentujące komunikaty zdefiniowane w dołączonych .proto plikach.
W przypadku zasobów po stronie serwera generowany jest abstrakcyjny typ podstawowy usługi. Typ podstawowy zawiera definicje wszystkich wywołań gRPC zawartych w .proto pliku. Utwórz konkretną implementację usługi, która pochodzi z tego typu podstawowego i implementuje logikę wywołań gRPC. W przykładzie greet.protoopisanym wcześniej jest abstrakcyjny GreeterBase typ, który zawiera metodę wirtualną SayHello . Konkretna implementacja GreeterService zastępuje metodę i implementuje logikę obsługując wywołanie 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
});
}
}
W przypadku zasobów po stronie klienta generowany jest konkretny typ klienta. Wywołania gRPC w .proto pliku są tłumaczone na metody określonego typu, które można wywołać. W przykładzie greet.protoopisanym wcześniej jest generowany konkretny GreeterClient typ. Wywołanie metody GreeterClient.SayHelloAsync w celu zainicjowania wywołania gRPC na serwerze.
// 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();
Domyślnie zasoby serwera i klienta są generowane dla każdego .proto pliku uwzględnionego <Protobuf> w grupie elementów. Aby upewnić się, że tylko zasoby serwera są generowane w projekcie serwera, GrpcServices atrybut jest ustawiony na Serverwartość .
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Podobnie atrybut jest ustawiany na Client wartość w projektach klienckich.
Dodatkowe zasoby
W tym dokumencie opisano pojęcia niezbędne do pisania aplikacji gRPC w języku C#. Omówione tutaj tematy dotyczą zarówno aplikacji gRPC opartych na języku C, jak i ASP.NET Core.
plik proto
Usługa gRPC korzysta z podejścia opartego na kontraktach do tworzenia interfejsów API. protokołu (protobuf) są domyślnie używane jako język IDL (Interface Definition Language). Plik .proto zawiera:
- Definicja usługi gRPC.
- Komunikaty wysyłane między klientami i serwerami.
Aby uzyskać więcej informacji na temat składni plików protobuf, zobacz Create Protobuf messages for .NET apps (Tworzenie komunikatów Protobuf dla aplikacji platformy .NET).
Rozważmy na przykład plik greet.proto używany w artykule Wprowadzenie do usługi gRPC:
- Definiuje usługę
Greeter. - Usługa
Greeterdefiniuje wywołanieSayHello. -
SayHelloHelloRequestwysyła wiadomość i odbieraHelloReplykomunikat:
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;
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
.proto Dodawanie pliku do aplikacji w języku C#
Plik .proto znajduje się w projekcie, dodając go do <Protobuf> grupy elementów:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Domyślnie odwołanie <Protobuf> generuje konkretnego klienta i klasę bazową usługi. Atrybut elementu odwołania może służyć do ograniczania generowania GrpcServices zasobów języka C#. Prawidłowe GrpcServices opcje to:
-
Both(wartość domyślna, jeśli nie jest obecna) ServerClientNone
Obsługa narzędzi języka C# dla plików .proto
Pakiet narzędzi Grpc.Tools jest wymagany do generowania zasobów języka C# z .proto plików. Wygenerowane zasoby (pliki):
- Są generowane zgodnie z potrzebami za każdym razem, gdy projekt jest kompilowany.
- Nie są dodawane do projektu ani sprawdzane w kontroli źródła.
- To artefakt kompilacji zawarty w katalogu obj .
Ten pakiet jest wymagany zarówno przez projekty serwera, jak i klienta. Metapakiet Grpc.AspNetCore zawiera odwołanie do Grpc.Tools. Projekty serwera mogą dodawać Grpc.AspNetCore przy użyciu Menedżer pakietów w programie Visual Studio lub dodając element <PackageReference> do pliku projektu:
<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" />
Projekty klienckie powinny bezpośrednio odwoływać Grpc.Tools się do innych pakietów wymaganych do korzystania z klienta gRPC. Pakiet narzędzi nie jest wymagany w czasie wykonywania, więc zależność jest oznaczona za pomocą polecenia 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>
Wygenerowane zasoby języka C#
Pakiet narzędzi generuje typy języka C# reprezentujące komunikaty zdefiniowane w dołączonych .proto plikach.
W przypadku zasobów po stronie serwera generowany jest abstrakcyjny typ podstawowy usługi. Typ podstawowy zawiera definicje wszystkich wywołań gRPC zawartych w .proto pliku. Utwórz konkretną implementację usługi, która pochodzi z tego typu podstawowego i implementuje logikę wywołań gRPC. W przykładzie greet.protoopisanym wcześniej jest abstrakcyjny GreeterBase typ, który zawiera metodę wirtualną SayHello . Konkretna implementacja GreeterService zastępuje metodę i implementuje logikę obsługując wywołanie 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
});
}
}
W przypadku zasobów po stronie klienta generowany jest konkretny typ klienta. Wywołania gRPC w .proto pliku są tłumaczone na metody określonego typu, które można wywołać. W przykładzie greet.protoopisanym wcześniej jest generowany konkretny GreeterClient typ. Wywołanie metody GreeterClient.SayHelloAsync w celu zainicjowania wywołania gRPC na serwerze.
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();
}
Domyślnie zasoby serwera i klienta są generowane dla każdego .proto pliku uwzględnionego <Protobuf> w grupie elementów. Aby upewnić się, że tylko zasoby serwera są generowane w projekcie serwera, GrpcServices atrybut jest ustawiony na Serverwartość .
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
Podobnie atrybut jest ustawiany na Client wartość w projektach klienckich.