Share via


與 gRPC 和具名管道的處理序間通訊

作者:James Newton-King

.NET 支援使用 gRPC 進行處理序間通訊 (IPC)。 如需開始使用 gRPC 以在處理序之間通訊的詳細資訊,請參閱與 gRPC 的處理序間通訊

具名管道是所有 Windows 版本所支援的 IPC 傳輸。 具名管道與 Windows 安全性整合良好,以控制管道的用戶端存取權。 本文討論如何透過具名管道來設定 gRPC 通訊。

必要條件

  • .NET 8 或更新版本
  • Windows

伺服器組態

Kestrel 支援具名管道,而前者設定於 Program.cs

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

上述範例:

  • ConfigureKestrel 中,設定 Kestrel 的端點。
  • 呼叫 ListenNamedPipe,以接聽具有所指定名稱的具名管道。
  • 建立未設定為使用 HTTPS 的具名管道端點。 如需啟用 HTTPS 的相關資訊,請參閱 Kestrel HTTPS 端點設定

用戶端組態

GrpcChannel 支援透過自訂傳輸進行 gRPC 呼叫。 建立通道後,可以使用具有自訂 ConnectCallbackSocketsHttpHandler 加以設定。 回呼可讓用戶端透過自訂傳輸進行連線,然後透過該傳輸傳送 HTTP 要求。

注意

的某些 GrpcChannel連線功能,例如用戶端負載平衡和通道狀態,無法與命名管道一起使用。

具名管道連線處理站範例:

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

使用自訂連線處理站來建立通道:

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

使用上述程式碼所建立的通道會透過具名管道來傳送 gRPC 呼叫。