次の方法で共有


.NET を使用したコードファーストの gRPC サービスとクライアント

Note

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

警告

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

作成者: James Newton-KingMarc Gravell

コードファースト gRPC では、.NET の型を使用して、サービスとメッセージ コントラクトを定義します。

コードファーストは、システム全体で .NET を使用する場合に適しています。

  • .Net サービスとデータ コントラクトの型は、.NET サーバーとクライアントの間で共有できます。
  • .proto ファイルおよびコード生成でコントラクトを定義する必要がなくなります。

複数の言語の多言語システムでは、コードファーストはお勧めできません。 .NET サービスとデータ コントラクトの型は、.NET 以外のプラットフォームでは使用できません。 コードファーストを使用して作成された gRPC サービスを呼び出すには、他のプラットフォームでサービスと一致する .proto コントラクトを作成する必要があります。

protobuf-net.Grpc

重要

protobuf-net.Grpc の支援が必要な場合は、protobuf-net.Grpc の Web サイトを参照するか、または protobuf-net.Grpc GitHub リポジトリでイシューを作成してください。

protobuf-net.Grpc はコミュニティ プロジェクトであり、Microsoft ではサポートされていません。 これにより、Grpc.AspNetCoreGrpc.Net.Client に対するコードファーストのサポートが追加されます。 属性で注釈が付けられた .NET 型を使用して、アプリの gRPC サービスとメッセージが定義されます。

コードファーストの gRPC サービスを作成するための最初の手順は、コード コントラクトを定義することです。

  • サーバーとクライアントによって共有される新しいプロジェクトを作成します。
  • protobuf-net.Grpc パッケージ リファレンスを追加します。
  • サービスとデータ コントラクトの型を作成します。
using ProtoBuf.Grpc;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Threading.Tasks;

namespace Shared.Contracts;

[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

上記のコードでは次の操作が行われます。

  • HelloRequest および HelloReply メッセージを定義します。
  • 単項 SayHelloAsync gRPC メソッドを使用して IGreeterService コントラクト インターフェイスを定義します。

サービス コントラクトがサーバーに実装され、クライアントから呼び出されます。

サービス インターフェイスに定義されるメソッドは、次のいずれであるかによって、特定のシグネチャと一致している必要があります。

  • 単項
  • サーバー ストリーミング。
  • クライアント ストリーミング
  • 双方向ストリーミング

サービス コントラクトの定義の詳細については、protobuf-net.Grpc の概要ドキュメントを参照してください。

コードファースト gRPC サービスを作成する

ASP.NET Core アプリに gRPC コードファースト サービスを追加するには、次のようにします。

  • protobuf-net.Grpc.AspNetCore パッケージ リファレンスを追加します。

  • 共有コードコントラクト プロジェクトへの参照を追加します。

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
      </ItemGroup>
    
      <ItemGroup>
          <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • 新しい GreeterService.cs ファイルを作成し、IGreeterService サービス インターフェイスを実装します。

    using Shared.Contracts;
    using ProtoBuf.Grpc;
    
    public class GreeterService : IGreeterService
    {
        public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
        {
            return Task.FromResult(
                    new HelloReply
                    {
                        Message = $"Hello {request.Name}"
                    });
        }
    }
    
  • Program.cs ファイルを更新します。

    using ProtoBuf.Grpc.Server;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Additional configuration is required to successfully run gRPC on macOS.
    // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
    
    // Add services to the container.
    builder.Services.AddCodeFirstGrpc();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    app.MapGrpcService<GreeterService>();
    app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
    
    app.Run();
    

    上記の強調表示されたコードにより、以下が更新されます。

    • AddCodeFirstGrpc により、コードファーストを有効にするサービスが登録されます。
    • MapGrpcService<GreeterService> により、コードファーストのサービス エンドポイントが追加されます。

コードファーストで実装された gRPC サービスと .proto ファイルは、同じアプリ内で共存できます。 すべての gRPC サービスでは、gRPC サービス構成が使されます。

コードファースト gRPC クライアントを作成する

コードファースト gRPC クライアントは、サービス コントラクトを使用して gRPC サービスを呼び出します。

  • gRPC クライアント .csproj ファイルで:

    • protobuf-net.Grpc パッケージ リファレンスを追加します。
    • Grpc.Net.Client パッケージの参照を追加します。
    • 共有コードコントラクト プロジェクトへの参照を追加します。
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
        <PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
      </ItemGroup>
        
      <ItemGroup>
        <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • クライアント program.cs を更新します

    // See https://aka.ms/new-console-template for more information
    using Grpc.Net.Client;
    using ProtoBuf.Grpc.Client;
    using Shared.Contracts;
    
    namespace GrpcGreeterClient;
    
    internal class Program
    {
        private static async Task Main(string[] args)
        {
            using var channel = GrpcChannel.ForAddress("https://localhost:7184");
            var client = channel.CreateGrpcService<IGreeterService>();
    
            var reply = await client.SayHelloAsync(
                new HelloRequest { Name = "GreeterClient" });
    
            Console.WriteLine($"Greeting: {reply.Message}");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
    
    
    

上記の gRPC クライアント Program.cs コードでは:

  • gRPC チャネルを作成します。
  • CreateGrpcService<IGreeterService> 拡張メソッドを使用して、チャネルからコードファースト クライアントを作成します。
  • SayHelloAsync を使用して gRPC サービスを呼び出します。

コードファースト gRPC クライアントがチャネルから作成されます。 通常のクライアントと同様に、コードファースト クライアントは、そのチャネル構成を使用します。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

その他のリソース

コードファースト gRPC では、.NET の型を使用して、サービスとメッセージ コントラクトを定義します。

コードファーストは、システム全体で .NET を使用する場合に適しています。

  • .Net サービスとデータ コントラクトの型は、.NET サーバーとクライアントの間で共有できます。
  • .proto ファイルおよびコード生成でコントラクトを定義する必要がなくなります。

複数の言語の多言語システムでは、コードファーストはお勧めできません。 .NET サービスとデータ コントラクトの型は、.NET 以外のプラットフォームでは使用できません。 コードファーストを使用して作成された gRPC サービスを呼び出すには、他のプラットフォームでサービスと一致する .proto コントラクトを作成する必要があります。

protobuf-net.Grpc

重要

protobuf-net.Grpc の支援が必要な場合は、protobuf-net.Grpc の Web サイトを参照するか、または protobuf-net.Grpc GitHub リポジトリでイシューを作成してください。

protobuf-net.Grpc はコミュニティ プロジェクトであり、Microsoft ではサポートされていません。 これにより、Grpc.AspNetCoreGrpc.Net.Client に対するコードファーストのサポートが追加されます。 属性で注釈が付けられた .NET 型を使用して、アプリの gRPC サービスとメッセージが定義されます。

コードファーストの gRPC サービスを作成するための最初の手順は、コード コントラクトを定義することです。

  • サーバーとクライアントによって共有される新しいプロジェクトを作成します。
  • protobuf-net.Grpc パッケージ リファレンスを追加します。
  • サービスとデータ コントラクトの型を作成します。
[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

上記のコードでは次の操作が行われます。

  • HelloRequest および HelloReply メッセージを定義します。
  • 単項 SayHelloAsync gRPC メソッドを使用して IGreeterService コントラクト インターフェイスを定義します。

サービス コントラクトがサーバーに実装され、クライアントから呼び出されます。 サービス インターフェイスに定義されているメソッドは、単項、サーバー ストリーミング、クライアント ストリーミング、または双方向ストリーミングのいずれであるかによって、特定の署名と一致する必要があります。

サービス コントラクトの定義の詳細については、protobuf-net.Grpc の概要ドキュメントを参照してください。

コードファースト gRPC サービスを作成する

ASP.NET Core アプリに gRPC コードファースト サービスを追加するには、次のようにします。

  • protobuf-net.Grpc.AspNetCore パッケージ リファレンスを追加します。
  • 共有コードコントラクト プロジェクトへの参照を追加します。

新しい GreeterService.cs ファイルを作成し、IGreeterService サービス インターフェイスを実装します。

public class GreeterService : IGreeterService
{
    public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
    {
        return Task.FromResult(
               new HelloReply
               {
                   Message = $"Hello {request.Name}"
               });
    }
}

Startup.cs ファイルを更新します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCodeFirstGrpc();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();
    });
}

上記のコードにより、次のことが行われます。

  • AddCodeFirstGrpc により、コードファーストを有効にするサービスが登録されます。
  • MapGrpcService<GreeterService> により、コードファーストのサービス エンドポイントが追加されます。

コードファーストで実装された gRPC サービスと .proto ファイルは、同じアプリ内で共存できます。 すべての gRPC サービスでは、gRPC サービス構成が使されます。

コードファースト gRPC クライアントを作成する

コードファースト gRPC クライアントは、サービス コントラクトを使用して gRPC サービスを呼び出します。 コードファースト クライアントを使用して gRPC サービスを呼び出すには、次のようにします。

  • protobuf-net.Grpc パッケージ リファレンスを追加します。
  • 共有コードコントラクト プロジェクトへの参照を追加します。
  • Grpc.Net.Client パッケージの参照を追加します。
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = channel.CreateGrpcService<IGreeterService>();

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "GreeterClient" });

Console.WriteLine($"Greeting: {reply.Message}");

上記のコードでは次の操作が行われます。

  • gRPC チャネルを作成します。
  • CreateGrpcService<IGreeterService> 拡張メソッドを使用して、チャネルからコードファースト クライアントを作成します。
  • SayHelloAsync を使用して gRPC サービスを呼び出します。

コードファースト gRPC クライアントがチャネルから作成されます。 通常のクライアントと同様に、コードファースト クライアントは、そのチャネル構成を使用します。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

その他のリソース