Bagikan melalui


Komunikasi antarproses dengan pipa gRPC dan Named

Oleh James Newton-King

.NET mendukung komunikasi antarproses (IPC) menggunakan gRPC. Untuk informasi selengkapnya tentang mulai menggunakan gRPC untuk berkomunikasi antar proses, lihat Komunikasi antarproses dengan gRPC.

Pipa bernama adalah transportasi IPC yang didukung pada semua versi Windows. Pipa bernama terintegrasi dengan baik dengan keamanan Windows untuk mengontrol akses klien ke pipa. Artikel ini membahas cara mengonfigurasi komunikasi gRPC melalui pipa bernama.

Prasyarat

  • .NET 8 atau yang lebih baru
  • Jendela

Konfigurasi server

Pipa bernama didukung oleh Kestrel, yang dikonfigurasi dalam Program.cs:

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

Contoh sebelumnya:

  • KestrelMengonfigurasi titik akhir di ConfigureKestrel.
  • ListenNamedPipe Panggilan untuk mendengarkan pipa bernama dengan nama yang ditentukan.
  • Membuat titik akhir pipa bernama yang tidak dikonfigurasi untuk menggunakan HTTPS. Untuk informasi tentang mengaktifkan HTTPS, lihat Kestrel Konfigurasi titik akhir HTTPS.

Konfigurasi klien

GrpcChannel mendukung melakukan panggilan gRPC melalui transportasi kustom. Saat saluran dibuat, saluran dapat dikonfigurasi dengan SocketsHttpHandler yang memiliki kustom ConnectCallback. Panggilan balik memungkinkan klien untuk membuat koneksi melalui transportasi kustom dan kemudian mengirim permintaan HTTP melalui transportasi tersebut.

Catatan

Beberapa fitur GrpcChannelkonektivitas , seperti penyeimbangan beban sisi klien dan status saluran, tidak dapat digunakan bersama dengan pipa bernama.

Contoh pabrik koneksi pipa bernama:

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

Menggunakan pabrik koneksi kustom untuk membuat saluran:

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

Saluran yang dibuat menggunakan kode sebelumnya mengirim panggilan gRPC melalui pipa bernama.