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 GrpcChannel
př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.