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.cs
yapı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 GrpcChannel
adlandı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.
ASP.NET Core