Share via


gRPC と名前付きパイプを使ったプロセス間通信

作成者: James Newton-King

.NET では、gRPC を使用したプロセス間通信 (IPC) がサポートされています。 gRPC を使用したプロセス間通信を開始する方法について詳しくは、「gRPC を使用したプロセス間通信」を参照してください。

名前付きパイプは、すべてのバージョンの Windows でサポートされている IPC トランスポートです。 名前付きパイプは Windows セキュリティと適切に統合され、パイプへのクライアント アクセスを制御します。 この記事では、名前付きパイプ経由で gRPC 通信を構成する方法について説明します。

前提条件

  • .NET 8 以降
  • Windows

サーバー構成

名前付きパイプは Kestrel でサポートされており、これは Program.cs で構成されます。

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenNamedPipe("MyPipeName", listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
    });
});

上記の例の場合:

  • Kestrelで ConfigureKestrel のエンドポイントを構成します。
  • ListenNamedPipe を呼び出して、指定した名前の名前付きパイプをリッスンします。
  • HTTPS を使用するように構成されていない名前付きパイプのエンドポイントを作成します。 HTTPS を有効にする方法については、Kestrel HTTPS エンドポイントの構成に関する記事を参照してください。

クライアントの構成

GrpcChannel では、カスタム トランスポート経由での gRPC 呼び出しがサポートされます。 チャネルが作成されると、カスタムの ConnectCallback がある SocketsHttpHandler で構成できます。 コールバックを使用すると、クライアントはカスタム トランスポート経由で接続を確立し、そのトランスポートを介して HTTP 要求を送信できます。

Note

クライアント側負荷分散やチャネル状態など、GrpcChannel の一部の接続機能は、名前付きパイプと一緒に使用することはできません。

名前付きパイプの接続ファクトリの例:

public class NamedPipesConnectionFactory
{
    private readonly string pipeName;

    public NamedPipesConnectionFactory(string pipeName)
    {
        this.pipeName = pipeName;
    }

    public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _,
        CancellationToken cancellationToken = default)
    {
        var clientStream = new NamedPipeClientStream(
            serverName: ".",
            pipeName: this.pipeName,
            direction: PipeDirection.InOut,
            options: PipeOptions.WriteThrough | PipeOptions.Asynchronous,
            impersonationLevel: TokenImpersonationLevel.Anonymous);

        try
        {
            await clientStream.ConnectAsync(cancellationToken).ConfigureAwait(false);
            return clientStream;
        }
        catch
        {
            clientStream.Dispose();
            throw;
        }
    }
}

カスタム接続ファクトリを使用してチャネルを作成する場合:

public static GrpcChannel CreateChannel()
{
    var connectionFactory = new NamedPipesConnectionFactory("MyPipeName");
    var socketsHttpHandler = new SocketsHttpHandler
    {
        ConnectCallback = connectionFactory.ConnectAsync
    };

    return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
    {
        HttpHandler = socketsHttpHandler
    });
}

上記のコードを使って作成されたチャネルは、名前付きパイプ経由で gRPC 呼び出しを送信します。