Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
.NET supporta la comunicazione tra processi (IPC) tramite gRPC. Per altre informazioni sull'uso di gRPC per comunicare tra processi, vedere Comunicazione tra processi con gRPC.
Named pipe è un trasporto IPC supportato in tutte le versioni di Windows. Le named pipe si integrano bene con la sicurezza di Windows per controllare l'accesso client alla pipe. Questo articolo illustra come configurare la comunicazione gRPC tramite named pipe.
Prerequisiti
- .NET 8 o versione successiva
- Windows
Configurazione del server
I pipe con nome sono supportati da Kestrel, che è configurato in Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenNamedPipe("MyPipeName", listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
L'esempio precedente:
- Configura gli endpoint Kestrel in ConfigureKestrel.
- Chiama
ListenNamedPipeper ascoltare una "named pipe" con il nome specificato. - Crea un endpoint "named pipe" che non è configurato per utilizzare HTTPS. Per informazioni sull'abilitazione di HTTPS, vedere Kestrel Configurazione dell'endpoint HTTPS.
Configurazione di PipeSecurity per pipe denominate
Per controllare quali utenti o gruppi possono connettersi, usare la NamedPipeTransportOptions classe . In questo modo è possibile specificare un oggetto personalizzato PipeSecurity .
Esempio:
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;
});
});
});
L'esempio precedente:
- Usa
UseNamedPipesper accedere e configurare NamedPipeTransportOptions. - Imposta la PipeSecurity proprietà per controllare quali utenti o gruppi possono connettersi alla named pipe.
- Concede l'accesso in lettura/scrittura al gruppo
Users. È possibile aggiungere regole di sicurezza aggiuntive in base alle esigenze per lo scenario.
Personalizzare gli endpoint dei named pipe Kestrel
KestrelIl supporto della named pipe consente la personalizzazione avanzata, consentendo di configurare impostazioni di sicurezza diverse per ogni endpoint usando l'opzione CreateNamedPipeServerStream . Questo approccio è ideale per scenari in cui più endpoint named pipe richiedono controlli di accesso univoci. La possibilità di personalizzare le pipe per endpoint è disponibile a partire da .NET 9.
Un esempio di dove questo è utile è un'app Kestrel che richiede due endpoint di pipe con sicurezza di accesso diversa. L'opzione CreateNamedPipeServerStream può essere usata per creare pipe con impostazioni di sicurezza personalizzate, a seconda del nome della pipe.
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);
};
});
Configurazione del client
GrpcChannel supporta l'esecuzione di chiamate gRPC su trasporti personalizzati. Quando viene creato un canale, può essere configurato con un SocketsHttpHandler che ha un ConnectCallback personalizzato. Il callback consente al client di effettuare connessioni su trasporti personalizzati e quindi inviare richieste HTTP su tale trasporto.
Annotazioni
Alcune funzionalità di connettività di GrpcChannel, ad esempio il bilanciamento del carico lato client e lo stato del canale, non possono essere usate insieme alle named pipe.
Esempio di factory di connessioni pipe nominate:
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 della factory di connessione personalizzata per creare un canale:
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
});
}
Canali creati usando il codice precedente inviano chiamate gRPC attraverso named pipes.