Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
.NET admite la comunicación entre procesos (IPC) mediante gRPC. Para obtener 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 de los clientes a la canalización. En este artículo se describe cómo configurar la comunicación gRPC a través de canalizaciones con nombre.
Prerrequisitos
- .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:
- Configura los Kestrelpuntos de conexión de en ConfigureKestrel.
- Llama a
ListenNamedPipepara escuchar una canalización nombrada 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, consulte Kestrel Configuración del punto de conexión HTTPS.
Configuración de PipeSecurity para canalizaciones con nombre
Para controlar qué usuarios o grupos pueden conectarse, use la NamedPipeTransportOptions clase . Esto permite especificar un objeto personalizado PipeSecurity .
Ejemplo:
using Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes;
using System.IO.Pipes;
using System.Security.AccessControl;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenNamedPipe("MyPipeName", listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
// Configure PipeSecurity
listenOptions.UseNamedPipes(options =>
{
var pipeSecurity = new PipeSecurity();
// Grant read/write access to the Users group
pipeSecurity.AddAccessRule(new PipeAccessRule(
"Users",
PipeAccessRights.ReadWrite,
AccessControlType.Allow));
// Add additional rules as needed
options.PipeSecurity = pipeSecurity;
});
});
});
Ejemplo anterior:
- Usa
UseNamedPipespara acceder a y configurar NamedPipeTransportOptions. - Establece la PipeSecurity propiedad para controlar qué usuarios o grupos pueden conectarse a la canalización con nombre.
- Concede acceso de lectura y escritura al grupo
Users. Se pueden agregar reglas de seguridad adicionales según sea necesario para el escenario.
Personalizción de puntos de conexión de canalización con nombre Kestrel
KestrelLa compatibilidad con las canalizaciones con nombre permite una personalización avanzada, permitiéndole configurar diferentes ajustes de seguridad para cada extremo mediante la opción CreateNamedPipeServerStream. Este enfoque es ideal para escenarios en los que varios puntos de conexión de tubería con nombre requieren controles de acceso únicos. La capacidad de personalizar canalizaciones por punto de conexión está disponible a partir de .NET 9.
Un ejemplo de dónde esto resulta útil es una aplicación Kestrel que requiere dos puntos de conexión de canalización con diferente seguridad de acceso. La opción CreateNamedPipeServerStream se puede usar para crear canalizaciones con configuraciones de seguridad personalizadas, en función del nombre de la canalización.
var builder = WebApplication.CreateBuilder();
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenNamedPipe("pipe1");
options.ListenNamedPipe("pipe2");
});
builder.WebHost.UseNamedPipes(options =>
{
options.CreateNamedPipeServerStream = (context) =>
{
var pipeSecurity = CreatePipeSecurity(context.NamedPipeEndpoint.PipeName);
return NamedPipeServerStreamAcl.Create(context.NamedPipeEndpoint.PipeName, PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte,
context.PipeOptions, inBufferSize: 0, outBufferSize: 0, pipeSecurity);
};
});
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 SocketsHttpHandler que tiene un ConnectCallback personalizado. La función de callback permite al cliente establecer conexiones mediante transportes personalizados y luego 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 pueden utilizarse junto con pipes con nombre.
Ejemplo de generador 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 personalizado 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 denominadas.