Compartir a través de


Comunicación entre procesos con gRPC y canalizaciones con nombre

Por James Newton-King

.NET admite la comunicación entre procesos (IPC) mediante gRPC. Para más información sobre cómo empezar a usar gRPC para comunicarse entre procesos, consulte Comunicación entre procesos con gRPC.

Las canalizaciones con nombre son un transporte IPC compatible con todas las versiones de Windows. Las canalizaciones con nombre se integran bien con la seguridad de Windows para controlar el acceso del cliente a la canalización. En este artículo se describe cómo configurar la comunicación gRPC a través de canalizaciones con nombre.

Requisitos previos

  • .NET 8 o posterior
  • Windows

Configuración del servidor

Las canalizaciones con nombre son compatibles con Kestrel, que se configura en Program.cs:

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

Ejemplo anterior:

  • Se configuran los puntos de conexión de Kestrel en ConfigureKestrel.
  • Llama a ListenNamedPipe para escuchar una canalización con nombre con el nombre especificado.
  • Crea un punto de conexión de canalización con nombre que no está configurado para usar HTTPS. Para obtener información sobre cómo habilitar HTTPS, vea Configuración de puntos de conexión HTTPS para Kestrel.

Configuración de cliente

GrpcChannel admite la realización de llamadas gRPC a través de transportes personalizados. Cuando se crea un canal, se puede configurar con un elemento SocketsHttpHandler que tenga un elemento ConnectCallback personalizado. La devolución de llamada permite al cliente realizar conexiones a través de transportes personalizados y, después, enviar solicitudes HTTP a través de ese transporte.

Nota:

Algunas características de conectividad de GrpcChannel, como el equilibrio de carga del lado cliente y el estado del canal, no se pueden usar junto con canalizaciones con nombre.

Ejemplo de fábrica de conexiones de canalizaciones con nombre:

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

Uso del generador de conexiones personalizadas para crear un canal:

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

Los canales creados con el código anterior envían llamadas gRPC a través de canalizaciones con nombre.