Aracılığıyla paylaş


C# içeren gRPC hizmetleri

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Warning

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Bu belgede C# dilinde gRPC uygulamaları yazmak için gereken kavramlar özetlenmiştir. Burada ele alınan konular hem C çekirdek tabanlı hem de ASP.NET Çekirdek tabanlı gRPC uygulamaları için geçerlidir.

proto dosyası

gRPC, API geliştirme için sözleşme öncelikli bir yaklaşım kullanır. Protokol arabellekleri (protobuf), varsayılan olarak Arabirim Tanım Dili (IDL) olarak kullanılır. Dosya .proto aşağıdakileri içerir:

  • gRPC hizmetinin tanımı.
  • İstemciler ve sunucular arasında gönderilen iletiler.

protobuf dosyalarının söz dizimi hakkında daha fazla bilgi için bkz . .NET uygulamaları için Protobuf iletileri oluşturma.

Örneğin, gRPC hizmetini kullanmaya başlama bölümünde kullanılan greet.proto dosyasını göz önünde bulundurun:

  • Bir Greeter hizmeti tanımlar.
  • Hizmet Greeter bir SayHello çağrı tanımlar.
  • SayHello bir HelloRequest ileti gönderir ve bir HelloReply ileti alır:
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 C# uygulamasına dosya ekleme

Dosya .proto , öğe grubuna <Protobuf> eklenerek projeye eklenir:

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

Varsayılan olarak, bir <Protobuf> referans, somut bir istemci ve bir hizmet taban sınıfı oluşturur. C# varlık oluşturmayı sınırlamak için başvuru öğesinin GrpcServices özniteliği kullanılabilir. Geçerli GrpcServices seçenekler şunlardır:

  • Both (mevcut olmadığında varsayılan)
  • Server
  • Client
  • None

.proto dosyaları için C# Araç desteği

Dosyalardan C# varlıklarını oluşturmak için Grpc.Tools.protogereklidir. Oluşturulan varlıklar (dosyalar):

  • Proje her oluşturulduğunda gerektiği gibi oluşturulur.
  • Projeye eklenmez veya kaynak denetimine işlenmez.
  • obj dizininde bulunan bir derleme nesnesidir.

Bu paket hem sunucu hem de istemci projeleri için gereklidir. Grpc.AspNetCore metapaketi, Grpc.Tools bir başvuru içerir. Sunucu projeleriGrpc.AspNetCore, Visual Studio'daki Paket Yöneticisi kullanarak veya proje dosyasına bir <PackageReference> ekleyerek ekleyebilir:

<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />

İstemci projeleri, gRPC istemcisini kullanmak için gereken diğer paketlerle birlikte Grpc.Tools'ye doğrudan başvuru yapmalıdır. Araç paketi çalışma zamanında gerekli olmadığından bağımlılık ile PrivateAssets="All"işaretlenir:

<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>

Oluşturulan C# varlıkları

Araç paketi, dahil .proto edilen dosyalarda tanımlanan iletileri temsil eden C# türlerini oluşturur.

Sunucu tarafı varlıklar için soyut bir hizmet temel türü oluşturulur. Temel tür, dosyada yer alan tüm gRPC çağrılarının tanımlarını .proto içerir. Bu temel türden türetilen ve gRPC çağrıları için mantığı uygulayan somut bir hizmet uygulaması oluşturun. Daha önce açıklanan örnekte, greet.proto için, sanal SayHello yöntem içeren bir soyut GreeterBase tür oluşturulur. Somut bir uygulama GreeterService yöntemini geçersiz kılar ve gRPC çağrısını işleyen mantığı uygular.

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
        });
    }
}

İstemci tarafı varlıklar için somut bir istemci türü oluşturulur. Dosyadaki .proto gRPC çağrıları, somut türdeki yöntemlere çevrilir ve bu yöntemler çağrılabilir. greet.proto için, daha önce açıklanan örnekte somut bir GreeterClient türü oluşturulur. Sunucuya bir gRPC çağrısı başlatmak için GreeterClient.SayHelloAsync çağırın.

// 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();

Varsayılan olarak, öğe grubuna .proto dahil edilen her <Protobuf> dosya için sunucu ve istemci varlıkları oluşturulur. Bir sunucu projesinde GrpcServices yalnızca sunucu varlıklarının oluşturulduğundan emin olmak için özniteliği olarak Serverayarlanır.

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

Benzer şekilde, öznitelik istemci projelerinde Client olarak ayarlanır.

Ek kaynaklar

Bu belgede C# dilinde gRPC uygulamaları yazmak için gereken kavramlar özetlenmiştir. Burada ele alınan konular hem C çekirdek tabanlı hem de ASP.NET Çekirdek tabanlı gRPC uygulamaları için geçerlidir.

proto dosyası

gRPC, API geliştirme için sözleşme öncelikli bir yaklaşım kullanır. Protokol arabellekleri (protobuf), varsayılan olarak Arabirim Tanım Dili (IDL) olarak kullanılır. Dosya .proto aşağıdakileri içerir:

  • gRPC hizmetinin tanımı.
  • İstemciler ve sunucular arasında gönderilen iletiler.

protobuf dosyalarının söz dizimi hakkında daha fazla bilgi için bkz . .NET uygulamaları için Protobuf iletileri oluşturma.

Örneğin, gRPC hizmetini kullanmaya başlama bölümünde kullanılan greet.proto dosyasını göz önünde bulundurun:

  • Bir Greeter hizmeti tanımlar.
  • Hizmet Greeter bir SayHello çağrı tanımlar.
  • SayHello bir HelloRequest ileti gönderir ve bir HelloReply ileti alır:
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 C# uygulamasına dosya ekleme

Dosya .proto , öğe grubuna <Protobuf> eklenerek projeye eklenir:

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

Varsayılan olarak, bir <Protobuf> referans, somut bir istemci ve bir hizmet taban sınıfı oluşturur. C# varlık oluşturmayı sınırlamak için başvuru öğesinin GrpcServices özniteliği kullanılabilir. Geçerli GrpcServices seçenekler şunlardır:

  • Both (mevcut olmadığında varsayılan)
  • Server
  • Client
  • None

.proto dosyaları için C# Araç desteği

Dosyalardan C# varlıklarını oluşturmak için Grpc.Tools.protogereklidir. Oluşturulan varlıklar (dosyalar):

  • Proje her oluşturulduğunda gerektiği gibi oluşturulur.
  • Projeye eklenmez veya kaynak denetimine işlenmez.
  • obj dizininde bulunan bir derleme nesnesidir.

Bu paket hem sunucu hem de istemci projeleri için gereklidir. Grpc.AspNetCore metapaketi, Grpc.Tools bir başvuru içerir. Sunucu projeleriGrpc.AspNetCore, Visual Studio'daki Paket Yöneticisi kullanarak veya proje dosyasına bir <PackageReference> ekleyerek ekleyebilir:

<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" />

İstemci projeleri, gRPC istemcisini kullanmak için gereken diğer paketlerle birlikte Grpc.Tools'ye doğrudan başvuru yapmalıdır. Araç paketi çalışma zamanında gerekli olmadığından bağımlılık ile PrivateAssets="All"işaretlenir:

<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>

Oluşturulan C# varlıkları

Araç paketi, dahil .proto edilen dosyalarda tanımlanan iletileri temsil eden C# türlerini oluşturur.

Sunucu tarafı varlıklar için soyut bir hizmet temel türü oluşturulur. Temel tür, dosyada yer alan tüm gRPC çağrılarının tanımlarını .proto içerir. Bu temel türden türetilen ve gRPC çağrıları için mantığı uygulayan somut bir hizmet uygulaması oluşturun. Daha önce açıklanan örnekte, greet.proto için, sanal SayHello yöntem içeren bir soyut GreeterBase tür oluşturulur. Somut bir uygulama GreeterService yöntemini geçersiz kılar ve gRPC çağrısını işleyen mantığı uygular.

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
        });
    }
}

İstemci tarafı varlıklar için somut bir istemci türü oluşturulur. Dosyadaki .proto gRPC çağrıları, somut türdeki yöntemlere çevrilir ve bu yöntemler çağrılabilir. greet.proto için, daha önce açıklanan örnekte somut bir GreeterClient türü oluşturulur. Sunucuya bir gRPC çağrısı başlatmak için GreeterClient.SayHelloAsync çağırın.

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();
}

Varsayılan olarak, öğe grubuna .proto dahil edilen her <Protobuf> dosya için sunucu ve istemci varlıkları oluşturulur. Bir sunucu projesinde GrpcServices yalnızca sunucu varlıklarının oluşturulduğundan emin olmak için özniteliği olarak Serverayarlanır.

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

Benzer şekilde, öznitelik istemci projelerinde Client olarak ayarlanır.

Ek kaynaklar