Sdílet prostřednictvím


Komunikace mezi procesy s gRPC a pojmenovanými kanály

Autor: James Newton-King

.NET podporuje komunikaci mezi procesy (IPC) pomocí gRPC. Další informace o tom, jak začít používat gRPC ke komunikaci mezi procesy, najdete v tématu Komunikace mezi procesy s gRPC.

Pojmenované kanály jsou přenosY IPC podporované ve všech verzích Windows. Pojmenované kanály se dobře integrují se zabezpečením Windows a řídí klientský přístup k kanálu. Tento článek popisuje, jak nakonfigurovat komunikaci gRPC přes pojmenované kanály.

Požadavky

  • .NET 8 nebo novější
  • Windows

Konfigurace serveru

Pojmenované kanály jsou podporovány Kestrel, který je nakonfigurován v Program.cs:

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

Předchozí příklad:

  • Konfiguruje Kestrelkoncové body v ConfigureKestrel.
  • Volání ListenNamedPipe pro naslouchání pojmenovaného kanálu se zadaným názvem.
  • Vytvoří pojmenovaný koncový bod kanálu, který není nakonfigurovaný tak, aby používal PROTOKOL HTTPS. Informace o povolení PROTOKOLU HTTPS najdete v tématu Kestrel Konfigurace koncového bodu HTTPS.

Konfigurace klienta

GrpcChannel podporuje volání gRPC přes vlastní přenosy. Po vytvoření kanálu je možné ho nakonfigurovat pomocí SocketsHttpHandler vlastního ConnectCallbackkanálu . Zpětné volání umožňuje klientovi vytvářet připojení přes vlastní přenosy a poté odesílat požadavky HTTP přes tento přenos.

Poznámka:

Některé funkce GrpcChannelpřipojení , jako je vyrovnávání zatížení na straně klienta a stav kanálu, se nedají používat společně s pojmenovanými kanály.

Příklad připojení pojmenovaných kanálů:

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

Vytvoření kanálu pomocí vlastní továrny pro připojení:

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

Kanály vytvořené pomocí předchozího kódu odesílají volání gRPC přes pojmenované kanály.