Eğitim
Öğrenme yolu
.NET Aspire ile dağıtılmış uygulamalar oluşturma - Training
.NET Aspire ile gözlemlenebilir, üretime hazır, dağıtılmış uygulamalar oluşturmayı öğrenin. AZ-2009
Bu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.
Aynı makinede çalışan işlemler birbiriyle iletişim kurmak için tasarlanabilir. İşletim sistemleri, hızlı ve verimli işlemler arası iletişimi (IPC) etkinleştirmeye yönelik teknolojiler sağlar. IPC teknolojilerinin popüler örnekleri Unix etki alanı yuvaları ve Adlandırılmış kanallardır.
.NET, gRPC kullanarak işlemler arası iletişim için destek sağlar.
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
IPC çağrıları bir istemciden sunucuya gönderilir. gRPC ile bir makinedeki uygulamalar arasında iletişim kurmak için en az bir uygulamanın bir ASP.NET Core gRPC sunucusu barındırması gerekir.
ASP.NET Core gRPC sunucusu genellikle gRPC şablonundan oluşturulur. Şablon tarafından oluşturulan proje dosyası SDK olarak kullanır Microsoft.NET.SDK.Web
:
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
Microsoft.NET.SDK.Web
SDK değeri, ASP.NET Core çerçevesine otomatik olarak bir başvuru ekler. Başvuru, uygulamanın bir sunucuyu barındırmak için gereken ASP.NET Core türlerini kullanmasına olanak tanır.
Windows Hizmetleri, WPF uygulamaları veya WinForms uygulamaları gibi mevcut non-ASP.NET Core projelerine sunucu eklemek de mümkündür. Daha fazla bilgi için bkz . non-ASP.NET Core projelerinde gRPC barındırma.
Farklı makinelerde bir istemci ile sunucu arasındaki gRPC çağrıları genellikle TCP yuvaları üzerinden gönderilir. TCP, bir ağ veya İnternet üzerinden iletişim kurmak için iyi bir seçimdir. Ancak, IPC aktarımları aynı makinedeki işlemler arasında iletişim kurarken avantajlar sunar:
.NET birden çok IPC aktarımını destekler:
İşletim sistemine bağlı olarak platformlar arası uygulamalar farklı IPC aktarımları seçebilir. Bir uygulama başlangıçta işletim sistemini denetleyebiliyor ve bu platform için istenen aktarımı seçebiliyor:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
if (OperatingSystem.IsWindows())
{
serverOptions.ListenNamedPipe("MyPipeName");
}
else
{
var socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
serverOptions.ListenUnixSocket(socketPath);
}
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
IPC uygulamaları RPC çağrıları gönderir ve alır. Dış iletişim, IPC uygulamaları için olası bir saldırı vektördür ve düzgün bir şekilde güvenli hale getirilmelidir.
IPC sunucusu uygulaması, diğer uygulamaların çağıracakları RPC hizmetlerini barındırıyor. Güvenilmeyen istemcilerin sunucuya RPC çağrıları yapmasını önlemek için gelen arayanların kimliği doğrulanmalıdır.
Aktarım güvenliği, sunucunun güvenliğini sağlamak için bir seçenektir. Unix etki alanı yuvaları ve adlandırılmış kanallar gibi IPC aktarımları, işletim sistemi izinlerine göre erişimi sınırlamayı destekler:
IPC sunucusunun güvenliğini sağlamak için bir diğer seçenek de ASP.NET Core'da yerleşik olarak bulunan kimlik doğrulaması ve yetkilendirmeyi kullanmaktır. Örneğin, sunucu sertifika kimlik doğrulaması gerektirecek şekilde yapılandırılabilir. gerekli sertifika olmadan istemci uygulamaları tarafından yapılan RPC çağrıları yetkisiz bir yanıtla başarısız olur.
İstemci uygulamasının çağırmış olduğu sunucunun kimliğini doğrulaması önemlidir. Doğrulama, kötü niyetli bir aktörün güvenilen sunucuyu durdurmasına, kendi sunucusunu çalıştırmasına ve istemcilerden gelen verileri kabul etmesine karşı koruma sağlamak için gereklidir.
Adlandırılmış kanallar, bir sunucunun altında çalıştığı hesabı almak için destek sağlar. İstemci, sunucunun beklenen hesap tarafından başlatıldığını doğrulayabilir:
internal static bool CheckPipeConnectionOwnership(
NamedPipeClientStream pipeStream, SecurityIdentifier expectedOwner)
{
var remotePipeSecurity = pipeStream.GetAccessControl();
var remoteOwner = remotePipeSecurity.GetOwner(typeof(SecurityIdentifier));
return expectedOwner.Equals(remoteOwner);
}
Sunucuyu doğrulamaya yönelik bir diğer seçenek de ASP.NET Core içindeki HTTPS ile uç noktalarının güvenliğini sağlamaktır. İstemci, bağlantı kurulduğunda sunucunun beklenen sertifikayı kullandığını doğrulamak için yapılandırabilir SocketsHttpHandler
.
var socketsHttpHandler = new SocketsHttpHandler()
{
SslOptions = new SslOptions()
{
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
if (sslPolicyErrors != SslPolicyErrors.None)
{
return false;
}
// Validate server cert thumbprint matches the expected thumbprint.
}
}
};
Adlandırılmış kanallar kimliğe bürünme adlı bir özelliği destekler. Kimliğe bürünme özelliğini kullanarak adlandırılmış kanallar sunucusu, istemci kullanıcının ayrıcalıklarıyla kod yürütebilir. Bu güçlü bir özelliktir, ancak düşük ayrıcalıklı bir sunucunun yüksek ayrıcalıklı bir çağıranın kimliğine bürünüp kötü amaçlı kod çalıştırmasına izin verebilir.
İstemciler bir sunucuya bağlanırken kimliğe bürünmeye izin vermeyerek bu saldırıya karşı koruyabilir. Sunucu tarafından gerekli kılınmadığı sürece, TokenImpersonationLevel istemci bağlantısı oluşturulurken veya None
değeri Anonymous
kullanılmalıdır:
using var pipeClient = new NamedPipeClientStream(
serverName: ".", pipeName: "testpipe", PipeDirection.In, PipeOptions.None, TokenImpersonationLevel.None);
await pipeClient.ConnectAsync();
TokenImpersonationLevel.None
, parametresi olmayan NamedPipeClientStream
oluşturucularda impersonationLevel
varsayılan değerdir.
İstemci ve sunucu, işlemler arası iletişim (IPC) aktarımı kullanacak şekilde yapılandırılmalıdır. IPC'yi yapılandırma Kestrel ve SocketsHttpHandler kullanma hakkında daha fazla bilgi için:
Not
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
Aynı makinede çalışan işlemler birbiriyle iletişim kurmak için tasarlanabilir. İşletim sistemleri, hızlı ve verimli işlemler arası iletişimi (IPC) etkinleştirmeye yönelik teknolojiler sağlar. IPC teknolojilerinin popüler örnekleri Unix etki alanı yuvaları ve Adlandırılmış kanallardır.
.NET, gRPC kullanarak işlemler arası iletişim için destek sağlar.
Not
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
Daha fazla bilgi için bu konunun .NET 8 veya sonraki sürümüne bakın
gRPC çağrıları bir istemciden sunucuya gönderilir. gRPC ile bir makinedeki uygulamalar arasında iletişim kurmak için en az bir uygulamanın bir ASP.NET Core gRPC sunucusu barındırması gerekir.
ASP.NET Core ve gRPC, çerçeveyi projeye ekleyerek Microsoft.AspNetCore.App
.NET Core 3.1 veya üzerini kullanarak herhangi bir uygulamada barındırılabilir.
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
Önceki proje dosyası:
Microsoft.AspNetCore.App
bir çerçeve başvurusu ekler. Çerçeve başvurusu, Windows Hizmetleri, WPF uygulamaları veya WinForms uygulamaları gibi non-ASP.NET Core uygulamalarının ASP.NET Core kullanmasına ve bir ASP.NET Core sunucusu barındırmasına olanak tanır.Grpc.AspNetCore
bir NuGet paket başvurusu ekler..proto
dosya ekler.Farklı makinelerde bir istemci ile sunucu arasındaki gRPC çağrıları genellikle TCP yuvaları üzerinden gönderilir. TCP, ağ üzerinden iletişim kurmak için tasarlanmıştır. Unix etki alanı yuvaları (UDS), istemci ve sunucu aynı makinede olduğunda TCP'den daha verimli olan yaygın olarak desteklenen bir IPC teknolojisidir. .NET, istemci ve sunucu uygulamalarında UDS için yerleşik destek sağlar.
Gereksinimler:
Unix etki alanı yuvaları (UDS), içinde Kestrelyapılandırılan tarafından Program.cs
desteklenir:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(options =>
{
if (File.Exists(SocketPath))
{
File.Delete(SocketPath);
}
options.ListenUnixSocket(SocketPath, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
});
Yukarıdaki örnek:
ConfigureKestrel
yapılandırıyor.
GrpcChannel
özel aktarımlar üzerinden gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel SocketsHttpHandler
bir içeren ile ConnectCallback
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.
Unix etki alanı yuvaları bağlantı fabrikası örneği:
public class UnixDomainSocketConnectionFactory
{
private readonly EndPoint _endPoint;
public UnixDomainSocketConnectionFactory(EndPoint endPoint)
{
_endPoint = endPoint;
}
public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _,
CancellationToken cancellationToken = default)
{
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
try
{
await socket.ConnectAsync(_endPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
}
}
Kanal oluşturmak için özel bağlantı fabrikasını kullanma:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static GrpcChannel CreateChannel()
{
var udsEndPoint = new UnixDomainSocketEndPoint(SocketPath);
var connectionFactory = new UnixDomainSocketConnectionFactory(udsEndPoint);
var socketsHttpHandler = new SocketsHttpHandler
{
ConnectCallback = connectionFactory.ConnectAsync
};
return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
{
HttpHandler = socketsHttpHandler
});
}
Önceki kod kullanılarak oluşturulan kanallar Unix etki alanı yuvaları üzerinden gRPC çağrıları gönderir. ve içindeki genişletilebilirlik KestrelSocketsHttpHandler
kullanılarak diğer IPC teknolojileri için destek uygulanabilir.
ASP.NET Core geri bildirimi
ASP.NET Core, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Eğitim
Öğrenme yolu
.NET Aspire ile dağıtılmış uygulamalar oluşturma - Training
.NET Aspire ile gözlemlenebilir, üretime hazır, dağıtılmış uygulamalar oluşturmayı öğrenin. AZ-2009