다음을 통해 공유


gRPC 및 명명된 파이프와의 프로세스 간 통신

작성자: James Newton-King

.NET은 gRPC를 사용하는 IPC(프로세스 간 통신)를 지원합니다. gRPC를 사용하여 프로세스 간 통신을 시작하는 방법에 대한 자세한 내용은 gRPC와의 프로세스 간 통신을 참조하세요.

명명된 파이프 는 모든 버전의 Windows에서 지원되는 IPC 전송입니다. 명명된 파이프는 Windows 보안잘 통합되어 파이프에 대한 클라이언트 액세스를 제어합니다. 이 문서에서는 명명된 파이프를 통해 gRPC 통신을 구성하는 방법을 설명합니다.

필수 조건

  • .NET 8 이상
  • Windows

서버 구성

명명된 파이프는 다음에서 구성된 다음에서 Program.cs지원Kestrel됩니다.

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 호출을 지원합니다. 채널을 만들 때 사용자 지정 ConnectCallback가 포함된 SocketsHttpHandler로 구성할 수 있습니다. 콜백을 사용하면 클라이언트가 사용자 지정 전송을 통해 연결한 다음 해당 전송을 통해 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 호출을 보냅니다.