Aracılığıyla paylaş


gRPC ve Adlandırılmış kanallar ile işlemler arası iletişim

Yayınlayan James Newton-King

.NET, gRPC kullanarak işlemler arası iletişimi (IPC) destekler. İşlemler arasında iletişim kurmak için gRPC kullanmaya başlama hakkında daha fazla bilgi için bkz . gRPC ile işlemler arası iletişim.

Adlandırılmış kanallar , Windows'un tüm sürümlerinde desteklenen bir IPC aktarımıdır. Adlandırılmış kanallar, kanala istemci erişimini denetlemek için Windows güvenliğiyle iyi bir şekilde tümleşir. Bu makalede, adlandırılmış kanallar üzerinden gRPC iletişimin nasıl yapılandırılacağı açıklanır.

Önkoşullar

  • .NET 8 veya üzeri
  • Windows

Sunucu yapılandırması

Adlandırılmış kanallar, içinde Program.csyapılandırılan tarafından Kestreldesteklenir:

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

Yukarıdaki örnek:

  • Kestrel'nin uç noktalarını içinde ConfigureKestrelyapılandırıyor.
  • Belirtilen ada sahip adlandırılmış bir kanalı dinlemek için çağrılar ListenNamedPipe .
  • HTTPS kullanacak şekilde yapılandırılmamış adlandırılmış bir kanal uç noktası oluşturur. HTTPS'yi etkinleştirme hakkında bilgi için bkz Kestrel . HTTPS uç noktası yapılandırması.

İstemci yapılandırması

GrpcChannel özel aktarımlar üzerinden gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel ConnectCallbackbir içeren ile SocketsHttpHandler yapılandırılabilir. Geri çağırma, istemcinin özel aktarımlar üzerinden bağlantı yapmasına ve ardından bu aktarım üzerinden HTTP istekleri göndermesine olanak tanır.

Dekont

İstemci tarafı yük dengeleme ve kanal durumu gibi bazı bağlantı özellikleri GrpcChanneladlandırılmış kanallarla birlikte kullanılamaz.

Adlandırılmış kanallar bağlantı fabrikası örneği:

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

Kanal oluşturmak için özel bağlantı fabrikasını kullanma:

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

Önceki kod kullanılarak oluşturulan kanallar adlandırılmış kanallar üzerinden gRPC çağrıları gönderir.