使用 gRPC 和命名管道进行进程间通信
.NET 支持使用 gRPC (IPC) 进行进程间通信 (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 调用。 创建通道后,可以使用包含自定义 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 调用。