Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tarafından Mitch Denny
ASP.NET Core'de Yerel uygulamaları önceden yayımlama ve dağıtma (AOT) çeşitli avantajlar sunar:
Küçültülmüş disk alanı. Yerel AOT kullanarak bir uygulama yayımladığınızda, işlem tek bir yürütülebilir dosya oluşturur. Yürütülebilir dosya yalnızca uygulamayı desteklemek için gereken dış bağımlılıklardan gelen kodu içerir. Azaltılmış yürütülebilir boyut aşağıdakilere yol açabilir:
- Konteynerli dağıtım senaryolarında kullanılan daha küçük konteyner görüntüleri.
- Daha kısa dağıtım süresi, daha küçük görüntülerden kaynaklanır.
Başlangıç süresi kısaltıldı. Yerel AOT uygulamaları daha az başlangıç süresi gerektirebilir ve bu da şunları sağlar:
- İstekleri daha hızlı karşılamak için uygulama.
- Kapsayıcı düzenleyicilerinin bir uygulama sürümünden diğerine geçişi yönettiği geliştirilmiş dağıtım.
Bellek talebi azaldı. Yerel AOT uygulamaları, uygulama tarafından yapılan çalışmaya bağlı olarak daha az bellek gerektirebilir. Azaltılmış bellek tüketimi, daha fazla dağıtım yoğunluğuna ve geliştirilmiş ölçeklenebilirliğe yol açabilir.
Aşağıdaki grafikte, çeşitli şablon uygulamalarındaki bir karşılaştırma testinin sonuçları gösterilmektedir. Karşılaştırma, AOT yayımlanmış bir uygulamanın (turuncu çubuk), kırpılmış çalışma zamanı uygulamasının (yeşil çubuk) ve denenmemiş çalışma zamanı uygulamasının (sarı çubuk) performansını karşılaştırır. Testte Yerel AOT uygulamasının daha düşük uygulama boyutu, bellek kullanımı ve başlangıç süresi gösterdiği ortaya çıktı.
Bu makalede, yayımlama ve dağıtıma genel bakış da dahil olmak üzere ASP.NET Core Yerel AOT uygulamaları desteği açıklanmaktadır.
Bu makaledeki yönergelere ek yapan veya onları yerine geçen ASP.NET Core Blazor WebAssembly Yerel AOT kılavuzu için bkz. ASP.NET Core Blazor WebAssembly derleme araçları ve ileri zamanlı derleme.
ASP.NET Core ve Yerel AOT uyumluluğunu gözden geçirme
ASP.NET Core'daki tüm özellikler şu anda Yerel AOT ile uyumlu değildir.
Aşağıdaki tabloda Yerel AOT ile ASP.NET Core özellik uyumluluğu özetlenmektedir.
| Özellik | Destekleniyor | Kısmi destek | Desteklenmiyor |
|---|---|---|---|
| Blazor Server | ❌ | ||
| Kaynaklar Arası Paylaşım (CORS) | ✔️ | ||
| gRPC | ✔️ | ||
| Sağlık Kontrolleri | ✔️ | ||
| HttpLogging | ✔️ | ||
| JWT Kimlik doğrulama | ✔️ | ||
| Yerelleştirme | ✔️ | ||
| Minimal API'ler | ✔️ | ||
| MVC | ❌ | ||
| OData | ❌ | ||
| Diğer Kimlik Doğrulaması | ❌ | ||
| Çıktı Önbellekleme | ✔️ | ||
| Hız Sınırlama | ✔️ | ||
| İstekSıkıştırmayıGeriAlma | ✔️ | ||
| Yanıt Önbellekleme | ✔️ | ||
| YanıtSıkıştırma | ✔️ | ||
| Yeniden Yaz | ✔️ | ||
| Oturum | ❌ | ||
| SignalR | ✔️ | ||
| Kaplıca | ❌ | ||
| StaticFiles | ✔️ | ||
| WebSockets Protokolü | ✔️ |
Sınırlamalar hakkında daha fazla bilgi için bkz:
- Yerel AOT dağıtımının sınırlamaları
- AOT uyarıları
- Bilinen kırpma uyumsuzlukları
- Kırpma uyarılarını düzeltme
Yerel AOT dağıtım modelinde uygulamayı doğrulama
Yerel AOT dağıtım modeline geçtiğiniz zaman uygulamayı kapsamlı bir şekilde test etmek önemlidir. AOT tarafından dağıtılan uygulamayı test edin ve işlevselliğin sıkıştırılmamış ve anında (JIT) derlenen uygulamadan değişmediğini onaylayın.
Uygulamayı oluştururken AOT uyarılarını gözden geçirin ve düzeltin. Yayımlama sırasında AOT uyarıları veren bir uygulama düzgün çalışmayabilir. Yayımlama zamanında hiçbir AOT uyarısı verilmediyse, yayımlanan AOT uygulamasının denenmeyen ve JIT ile derlenmiş uygulamayla aynı şekilde çalışmasını bekleyebilirsiniz.
Yerel AOT uygulaması yayımlama (PublishAot)
MSBuild özelliğini kullanarak uygulamanız için Yerel AOT'yi PublishAot etkinleştirin. Aşağıdaki örnekte proje dosyasında Yerel AOT'nin nasıl etkinleştirileceği gösterilmektedir:
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
PublishAot özelliği, yayımlama işlemi sırasında Yerel AOT derlemesini etkinleştirir ve derleme ve düzenleme sırasında dinamik kod kullanım analizini etkinleştirir. Yerel AOT yayımlama kullanan bir proje, yerel olarak çalıştırıldığında JIT derlemesi uygular.
AOT uygulaması, JIT ile derlenmiş bir uygulamadan aşağıdaki farklara sahiptir:
- Yerel AOT ile uyumlu olmayan özellikler devre dışı bırakılır ve çalışma anında istisnalar fırlatır.
- Yerel AOT ile uyumlu olmayan kodu vurgulamak için bir kaynak çözümleyici etkinleştirilir. Yayımlama zamanında NuGet paketleri de dahil olmak üzere uygulamanın tamamı uyumluluk açısından yeniden analiz edilir.
Yerel AOT analizi tüm uygulama kodunu ve uygulamanın bağımlı olduğu kitaplıkları içerir. Yerel AOT uyarılarını gözden geçirin ve düzeltici adımları uygulayın. Geliştirme yaşam döngüsünün başlarındaki sorunları keşfetmek için uygulamaları sık sık yayımlamak iyi bir fikirdir.
.NET 8 ve sonraki sürümlerde, aşağıdaki ASP.NET Core uygulama türleri Yerel AOT'yi destekler:
- Minimum API'ler - Daha fazla bilgi için bu makalenin devamında Web API'sini (Yerel AOT) gözden geçirme bölümüne bakın.
- gRPC - Daha fazla bilgi için bkz. gRPC ve Yerel AOT.
Worker services - Daha fazla bilgi için bkz.ASP.NET Core içinde barındırılan hizmetler ileNative AOT Arka Plan Görevleri.
Web API (Yerel AOT) şablonunu gözden geçirin
ASP.NET Core Web API 'si (Yerel AOT) şablonu (kısa ad webapiaot) AOT etkin bir proje oluşturur. Şablon, aşağıdaki yollarla standart bir Web API'si proje şablonundan farklıdır:
- MVC henüz Yerel AOT ile uyumlu olmadığından sadece Minimal API'ler kullanır.
- Yalnızca temel özelliklerin CreateSlimBuilder() varsayılan olarak etkinleştirildiğinden emin olmak için API'yi kullanır ve bu da uygulamanın dağıtılan boyutunu en aza indirir.
- Yalnızca HTTP'de dinleyecek şekilde yapılandırılmıştır. HTTPS trafiği genellikle buluta özel dağıtımlarda giriş hizmeti tarafından işlenir.
- IIS veya IIS Express altında çalıştırmak için başlatma profili içermez.
- Uygulamanın uç noktalarına gönderilebilen örnek HTTP istekleriyle yapılandırılmış bir .http dosyası oluşturur.
- Hava durumu tahmini örneği yerine bir örnek
TodoAPI içerir. -
PublishAotÖzelliğini daha önce açıklandığı gibi proje dosyasına ekler. - JSON seri hale getirici kaynak oluşturucularını etkinleştirir. Kaynak kod oluşturucu, Native AOT derlemesi için gerekli olan serileştirme kodunu derleme sırasında oluşturmak için kullanılır.
JSON serileştirme için kod güncelleştirmeleri (Program.cs)
Program.cs dosyasındaki kod, JSON serileştirme kaynağı oluşturma desteği sağlamak üzere değiştirilir.
Aşağıdaki kod parçacığı kodda yapılan değişiklikleri gösterir:
using MyFirstAotWebApi;
+using System.Text.Json.Serialization;
-var builder = WebApplication.CreateBuilder();
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
Kodu değiştirmezseniz, System.Text.Json JSON serileştirme ve seriden çıkarma için yansıma kullanır. Reflection Native AOT'de desteklenmez.
Daha fazla bilgi için bkz.
Başlatma profili için kod değişiklikleri (launchSettings.json)
Web API (Yerel AOT) şablonu bir launchSettings.json dosyası oluşturur. Standart başlatma dosyasının aksine, oluşturulan dosya iisSettings bölümünü veya IIS Express profilini içermez.
Aşağıdaki kod parçacığı, dışlanan bölümleri (kırmızı renkli) gösterir:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:11152",
- "sslPort": 0
- }
- },
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "todos",
"applicationUrl": "http://localhost:5102",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "todos",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
}
}
Minimum uygulama varsayılanları için CreateSlimBuilder() çağrıldı
Web API'si CreateSlimBuilder() şablonu yöntemi yerine CreateBuilder() yöntemini kullanır.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
CreateSlimBuilder yöntemi, WebApplicationBuilder, bir uygulamayı çalıştırmak için gerekli olan minimum ASP.NET Core özellikleriyle başlatır.
Daha önce açıklandığı gibi, CreateSlimBuilder yöntemi HTTPS veya HTTP/3 desteğini içermez. Bu protokoller genellikle TLS sonlandırma ara sunucusunun arkasında çalışan uygulamalar için gerekli değildir. Örneğin, Application Gateway ile TLS sonlandırma ve uçtan uca TLS örneğine bakın. HTTPS'yi, builder.WebHost.UseKestrelHttpsConfiguration yöntemini çağırarak etkinleştirebilirsiniz veya HTTP/3'ü builder.WebHost.UseQuic yöntemini çağırarak etkinleştirin.
CreateSlimBuilder() ve CreateBuilder() karşılaştırması
CreateSlimBuilder yöntemi, CreateBuilder yöntemiyle kullanılabilen uygulama özelliklerinin bir bölümüne erişim sağlar. Daha önce açıklandığı gibi, Web API (Yerel AOT) şablonu CreateSlimBuilder başlatmak için WebApplicationBuilder çağırır, böylece oluşturucu uygulamayı çalıştırmak için gereken en düşük ASP.NET Core özelliklerini kullanır.
Her iki yöntem de verimli bir geliştirme deneyimi için gerekli özellikleri sağlar:
- appsettings.json ve uygulama ayarları için yapılandırma.{ EnvironmentName}.json dosyaları
- Kullanıcı gizli bilgileri yapılandırması
- Konsol loglama
- Günlük ayarları
Minimum özelliklerin dahil edilmesi, kırpma işlemi ve AOT için yarar sağlar. Daha fazla bilgi için Bağımsız dağıtımları ve yürütülebilir dosyaları kırpma bölümüne bakın.
Tüm özellikleri atlayan bir oluşturucu kullanmayı tercih ediyorsanız Bkz. WebApplication.CreateEmptyBuilder yöntemi.
CreateSlimBuilder'da kullanılamayan özellikler
CreateSlimBuilder yöntemi, içinde kullanılabilen aşağıdaki özellikleri CreateBuilder:
- Başlangıç bütünleştirilmiş kodlarını barındırma
- UseStartup yöntemi
- Günlüğe kaydetme sağlayıcıları:
- Web barındırma özellikleri:
- UseStaticWebAssets yöntemi
- IIS tümleştirmesi
- Kestrel Yapılandırma:
- Regex ve yönlendirmede kullanılan alfa kısıtlamaları (GitHub /dotnet/aspnetcore/issues #46142)
Daha ayrıntılı bilgi için bkz. WebApplication.CreateBuilder ile CreateSlimBuilder karşılaştırması
Kaynak oluşturucuları kullanma ve yansımayı önleme
Native AOT için yayımlama işlemi sırasında kullanılmayan tüm kodlar kırpılır. Sonuç olarak, bir uygulama çalışma zamanında ilişkisiz yansıma kullanamaz. Yansıma gereksinimini önleyen kod üreten kaynak oluşturucuları kullanabilirsiniz. Bazı durumlarda, bir oluşturucu gerekli olmadığında bile kaynak oluşturucular AOT için iyileştirilmiş çıkış kodu oluşturur.
Oluşturulan kaynak kodu görüntülemek için EmitCompilerGeneratedFiles özelliğini uygulama projesi (.csproj) dosyasına ekleyin:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <!-- Other properties omitted for brevity --> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> </PropertyGroup> </Project>Oluşturulan kodu görmek için komutunu çalıştırın
dotnet build. komutu kaynak dosyaları derler ve uygulamayı geliştirme ortamında çalıştırmak için gereken ara dosyaları oluşturur. Çıktı, proje için oluşturulan tüm dosyaları içeren bir obj/Debug/<.NET sürümü>/generated/ dizini içerir.Uygulamayı dağıtıma hazırlamak için komutunu çalıştırın
dotnet publish. komutu kaynak dosyaları derler ve uygulamayı dağıtmak için gereken tüm dosyaları oluşturur. Oluşturulan derlemeleri yerel yürütülebilir dosyayı üreten yerel bir IL derleyicisine geçirir. Yerel yürütülebilir dosya yerel makine kodunu içerir.
Yerel AOT ile kitaplıkları kullanma
ASP.NET Core projelerinde kullanılan birçok popüler kitaplık şu anda Yerel AOT'yi hedefleyen projelere dahil edildiğinde bazı uyumluluk sorunlarına sahiptir, örneğin:
- Türleri incelemek ve bulmak için yansıma kullanma
- Kitaplıkları çalışma zamanında koşullu olarak yükleme
- İşlevselliği uygulamak için anında kod oluşturma
Bu dinamik özellikleri kullanan kitaplıkların Yerel AOT ile çalışması için güncelleştirmeler gerekir. Roslyn kaynak oluşturucuları gibi gerekli güncelleştirmeleri uygulamak için çeşitli araçlar mevcuttur.
Yerel AOT'yi desteklemeyi umut eden kitaplık yazarlarının aşağıdaki makaleleri gözden geçirmesi teşvik edilir:
Minimum API'ler ve JSON yükleriyle çalışma
Minimal API çerçevesi, JSON yüklerini almak ve döndürmek için System.Text.Json kullanılarak optimize edilmiştir.
- Ad alanı JSON ve Yerel AOT için uyumluluk gereksinimleri uygular.
- System.Text.Json kaynak oluşturucunun kullanılmasını gerektirir.
HTTP gövdesinin bir parçası olarak iletilen veya Minimal API uygulamalarındaki istek temsilcilerinden döndürülen tüm türler, bir JsonSerializerContext örneğinde yapılandırılmalıdır. ASP.NET Core bağımlılık enjeksiyonu ile örneğin kaydedilmesi gerekir.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
JSON seri hale getirici bağlamı DI kapsayıcısıyla kaydedilir. Daha fazla bilgi için bkz Kaynak oluşturucularını birleştirme ve TypeInfoResolverChain.
Özel
JsonSerializerContext, türü için kaynak tarafından üretilen JSON seri hale getirici kodunu etkinleştirenToDoözniteliği ile açıklanır.
Temsilcide gövdeye bağlı olmayan bir parametrenin serileştirilebilir olması gerekmez. Örneğin, sorgu dizesi parametresi uygulayan IParsable<T>zengin bir nesne türü olabilir.
public class Todo
{
public int Id { get; set; }
public string? Title { get; set; }
public DateOnly? DueBy { get; set; }
public bool IsComplete { get; set; }
}
static class TodoGenerator
{
private static readonly (string[] Prefixes, string[] Suffixes)[] _parts = new[]
{
(new[] { "Walk the", "Feed the" }, new[] { "dog", "cat", "goat" }),
(new[] { "Do the", "Put away the" }, new[] { "groceries", "dishes", "laundry" }),
(new[] { "Clean the" }, new[] { "bathroom", "pool", "blinds", "car" })
};
// Remaining code omitted for brevity.
Bilinen sorunları gözden geçirme
ASP.NET Core'da Yerel AOT desteğiyle ilgili sorunları bildirmek veya gözden geçirmek için bkz. GitHub /dotnet/core/issues #8288).
İlgili içerik
> Native AOT - Yerel AOT dağıtımı
- AOT dağıtımlarını iyileştirme
.NET 8, .NET yerel zamanından önce (AOT) için destek sağlar.
ASP.NET Core ile Yerel AOT neden kullanılır?
Yerel AOT uygulamasını yayımlama ve dağıtma aşağıdaki avantajları sağlar:
-
En aza indirgenmiş disk ayak izi: Yerel AOT kullanılarak yayımlanırken, yalnızca programı desteklemek için gereken dış bağımlılıkların kodunu içeren tek bir yürütülebilir dosya oluşturulur. Yürütülebilir boyutun küçültülmesi şu sonuçlara neden olabilir:
- Konteynerli dağıtım senaryolarında kullanılan daha küçük konteyner görüntüleri.
- Daha kısa dağıtım süresi, daha küçük görüntülerden kaynaklanır.
-
Daha kısa başlangıç süresi: Yerel AOT uygulamaları daha az başlatma süresi gösterebilir, yani
- Uygulama, isteklere daha hızlı hizmet vermek için hazırdır.
- Kapsayıcı düzenleyicilerinin uygulamanın bir sürümünden diğerine geçişi yönetmesi gereken geliştirilmiş dağıtım.
- Daha az bellek talebi: Yerel AOT uygulamaları, uygulama tarafından yapılan çalışmaya bağlı olarak daha az bellek talebine sahip olabilir. Azaltılmış bellek tüketimi, daha fazla dağıtım yoğunluğuna ve geliştirilmiş ölçeklenebilirliğe yol açabilir.
Şablon uygulaması, AOT tarafından yayımlanan bir uygulamanın, kırpılmış bir çalışma zamanı uygulamasının ve denenmemiş bir çalışma zamanı uygulamasının performansını karşılaştırmak için karşılaştırma laboratuvarımızda çalıştırıldı. Aşağıdaki grafikte karşılaştırmanın sonuçları gösterilmektedir:
Yukarıdaki grafik, Yerel AOT'nin daha düşük uygulama boyutuna, bellek kullanımına ve başlangıç süresine sahip olduğunu gösterir.
ASP.NET Core ve Native AOT uyumluluğu
ASP.NET Core'daki tüm özellikler şu anda Yerel AOT ile uyumlu değildir. Aşağıdaki tabloda Yerel AOT ile ASP.NET Core özellik uyumluluğu özetlenmektedir.
| Özellik | Tam Olarak Desteklenir | Kısmen Desteklenir | Desteklenmiyor |
|---|---|---|---|
| gRPC | Tam olarak desteklenir | ||
| Minimal API'ler | Kısmen desteklenir | ||
| MVC | Desteklenmiyor | ||
| Blazor Server | Desteklenmiyor | ||
| SignalR | Desteklenmiyor | ||
| JWT Kimlik doğrulama | Tam olarak desteklenir | ||
| Diğer Kimlik Doğrulaması | Desteklenmiyor | ||
| Kaynaklar Arası Paylaşım (CORS) | Tam olarak desteklenir | ||
| Sağlık Kontrolleri | Tam olarak desteklenir | ||
| HttpLogging | Tam olarak desteklenir | ||
| Yerelleştirme | Tam olarak desteklenir | ||
| Çıktı Önbellekleme | Tam olarak desteklenir | ||
| Hız Sınırlama | Tam olarak desteklenir | ||
| İstekSıkıştırmayıGeriAlma | Tam olarak desteklenir | ||
| Yanıt Önbellekleme | Tam olarak desteklenir | ||
| YanıtSıkıştırma | Tam olarak desteklenir | ||
| Yeniden Yaz | Tam olarak desteklenir | ||
| Oturum | Desteklenmiyor | ||
| Kaplıca | Desteklenmiyor | ||
| StaticFiles | Tam olarak desteklenir | ||
| WebSockets Protokolü | Tam olarak desteklenir |
Sınırlamalar hakkında daha fazla bilgi için bkz:
- Yerel AOT dağıtımının sınırlamaları
- AOT uyarılarına giriş
- Bilinen kırpma uyumsuzlukları
- Kesme uyarılarına giriş
- GitHub sorunu dotnet/core #8288
Yerel AOT dağıtım modeline geçerken bir uygulamayı kapsamlı bir şekilde test etmek önemlidir. AOT ile dağıtılan uygulama, işlevselliğin denenmemiş ve JIT ile derlenmiş uygulamadan değişmediğini doğrulamak için test edilmelidir. Uygulamayı oluştururken AOT uyarılarını gözden geçirin ve düzeltin. Yayımlama sırasında AOT uyarıları veren bir uygulama düzgün çalışmayabilir. Yayımlama zamanında hiçbir AOT uyarısı verilmediyse, yayımlanan AOT uygulaması denenmeyen ve JIT ile derlenmiş uygulamayla aynı şekilde çalışmalıdır.
Yerel AOT yayımlama
Yerel AOT, MSBuild özelliğiyle PublishAot etkinleştirilir. Aşağıdaki örnekte proje dosyasında Yerel AOT'nin nasıl etkinleştirileceği gösterilmektedir:
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
Bu ayar yayımlama sırasında Yerel AOT derlemesini etkinleştirir ve derleme ve düzenleme sırasında dinamik kod kullanım analizini etkinleştirir. Yerel AOT yayımlama kullanan bir proje, yerel olarak çalıştırıldığında JIT derlemesi kullanır. AOT uygulaması, JIT ile derlenmiş bir uygulamadan aşağıdaki farklara sahiptir:
- Yerel AOT ile uyumlu olmayan özellikler devre dışı bırakılır ve çalışma anında istisnalar fırlatır.
- Yerel AOT ile uyumlu olmayan kodu vurgulamak için bir kaynak çözümleyici etkinleştirilir. Yayımlama zamanında NuGet paketleri de dahil olmak üzere uygulamanın tamamı uyumluluk açısından yeniden analiz edilir.
Yerel AOT analizi, uygulamanın tüm kodunu ve uygulamanın bağımlı olduğu kitaplıkları içerir. Yerel AOT uyarılarını gözden geçirin ve düzeltici adımları uygulayın. Geliştirme yaşam döngüsünün başlarındaki sorunları keşfetmek için uygulamaları sık sık yayımlamak iyi bir fikirdir.
.NET 8'de Yerel AOT, aşağıdaki ASP.NET Core uygulama türleri tarafından desteklenir:
- Minimum API'ler - Daha fazla bilgi için bu makalenin devamında yer alan Web API'si (Yerel AOT) şablonu bölümüne bakın.
- gRPC - Daha fazla bilgi için gRPC ve Yerel AOT konularına bakın.
- Çalışan hizmetleri - Daha fazla bilgi için bkz Çalışan Hizmeti şablonlarında AOT.
Web API'si (Yerel AOT) şablonu
ASP.NET Core Web API(Yerel AOT) şablonu (kısa adwebapiaot) AOT etkin bir proje oluşturur. Şablon, Web API proje şablonundan aşağıdaki yollarla farklıdır:
- MVC henüz Yerel AOT ile uyumlu olmadığından sadece Minimal API'ler kullanır.
- Api'yi CreateSlimBuilder() kullanarak yalnızca temel özelliklerin varsayılan olarak etkinleştirildiğinden emin olur ve uygulamanın dağıtılan boyutunu en aza indirir.
- HTTPS trafiği genellikle bulut yerlisi dağıtımlarda bir ingress hizmeti tarafından işlendiğinden yalnızca HTTP'de dinleyecek şekilde yapılandırılır.
- IIS veya IIS Express altında çalıştırmak için başlatma profili içermez.
- Uygulamanın uç noktalarına gönderilebilen örnek HTTP istekleriyle yapılandırılmış bir
.httpdosya oluşturur. - Hava durumu tahmini örneği yerine bir örnek
TodoAPI içerir. - Proje dosyasına, bu makalenin
PublishAotekler. - JSON seri hale getirici kaynak oluşturucularını etkinleştirir. Kaynak kod oluşturucu, Native AOT derlemesi için gerekli olan serileştirme kodunu derleme sırasında oluşturmak için kullanılır.
Kaynak oluşturmayı desteklemek için yapılan değişiklikler
Aşağıdaki örnekte, JSON serileştirme kaynağı oluşturmayı desteklemek için dosyaya eklenen Program.cs kod gösterilmektedir:
using MyFirstAotWebApi;
+using System.Text.Json.Serialization;
-var builder = WebApplication.CreateBuilder();
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
Bu ek kod olmadan, System.Text.Json JSON serileştirmek ve seri durumdan çıkarmak için yansıma kullanır. Reflection Native AOT'de desteklenmez.
Daha fazla bilgi için bkz.
Değişiklikler: launchSettings.json
launchSettings.json Web API'si (Yerel AOT) şablonu tarafından oluşturulan dosyada iisSettings bölüm ve IIS Express profil kaldırıldı:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:11152",
- "sslPort": 0
- }
- },
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "todos",
"applicationUrl": "http://localhost:5102",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "todos",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
}
}
CreateSlimBuilder yöntemi
Şablon, CreateSlimBuilder() yöntemi yerine CreateBuilder() yöntemini kullanır.
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
CreateSlimBuilder yöntemi, WebApplicationBuilder, bir uygulamayı çalıştırmak için gerekli olan minimum ASP.NET Core özellikleriyle başlatır.
Daha önce belirtildiği gibi, CreateSlimBuilder yöntem HTTPS veya HTTP/3 desteğini içermez. Bu protokoller genellikle TLS sonlandırma ara sunucusunun arkasında çalışan uygulamalar için gerekli değildir. Örneğin, Application Gateway ile TLS sonlandırma ve uçtan uca TLS örneğine bakın. HTTPS, oluşturucusu çağrılarak etkinleştirilebilir. WebHost.UseKestrelHttpsConfiguration HTTP/3, oluşturucu çağrılarak etkinleştirilebilir. WebHost.UseQuic.
CreateSlimBuilder ve CreateBuilder
CreateSlimBuilder yöntemi, CreateBuilder yönteminin desteklediği aşağıdaki özellikleri desteklemez:
- Başlangıç bütünleştirilmiş kodlarını barındırma
- UseStartup
- Aşağıdaki günlük sağlayıcıları:
- Web barındırma özellikleri:
- Kestrel konfigürasyon
- Yönlendirmede kullanılan regex ve alfa kısıtlamaları
yöntemi, CreateSlimBuilder verimli bir geliştirme deneyimi için gereken aşağıdaki özellikleri içerir:
-
appsettings.jsonveappsettings.{EnvironmentName}.jsoniçin JSON dosyası yapılandırması. - Kullanıcı gizli bilgileri yapılandırması.
- Konsol loglaması.
- Günlük kaydı yapılandırması.
Önceki özellikleri atlayan bir oluşturucu için CreateEmptyBuilder yöntemine bakın.
Minimum özelliklerin dahil edilmesi, kırpma işlemi ve AOT için yarar sağlar. Daha fazla bilgi için Bağımsız dağıtımları ve yürütülebilir dosyaları kırpma bölümüne bakın.
Daha ayrıntılı bilgi için bkz. Karşılaştırma WebApplication.CreateBuilderCreateSlimBuilder
Kaynak oluşturucular
Yerel AOT için yayımlama sırasında kullanılmayan kod kırpıldığından, uygulama çalışma zamanında sınırsız yansıma kullanamaz. Kaynak oluşturucular , yansıma gereksinimini önleyen kod üretmek için kullanılır. Bazı durumlarda, kaynak oluşturucular bir oluşturucu gerekli olmadığında bile AOT için iyileştirilmiş kod üretir.
Oluşturulan kaynak kodunu görüntülemek için, aşağıdaki örnekte gösterildiği gibi özelliğini uygulamanın EmitCompilerGeneratedFiles dosyasına ekleyin.csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<!-- Other properties omitted for brevity -->
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
</Project>
dotnet build Oluşturulan kodu görmek için komutunu çalıştırın. Çıktı, proje için oluşturulan tüm dosyaları içeren bir obj/Debug/net8.0/generated/ dizin içerir.
Komut dotnet publish ayrıca kaynak dosyaları derler ve derlenmiş dosyalar oluşturur. Ayrıca, dotnet publish oluşturulan derlemeleri yerel bir IL derleyicisine geçirir. IL derleyicisi yerel yürütülebilir dosyayı üretir. Yerel yürütülebilir dosya yerel makine kodunu içerir.
Yerel AOT ile kitaplıkları kullanma
ASP.NET Core projelerinde kullanılan birçok popüler kitaplık şu anda Yerel AOT'yi hedefleyen projelere dahil edildiğinde bazı uyumluluk sorunlarına sahiptir, örneğin:
- Türleri incelemek ve bulmak için yansıma kullanma
- Kitaplıkları çalışma zamanında koşullu olarak yükleme
- İşlevselliği uygulamak için anında kod oluşturma
Bu dinamik özellikleri kullanan kitaplıkların Yerel AOT ile çalışması için güncelleştirmeler gerekir. Roslyn kaynak oluşturucuları gibi gerekli güncelleştirmeleri uygulamak için çeşitli araçlar mevcuttur.
Yerel AOT'yi desteklemeyi umut eden kitaplık yazarlarının aşağıdaki makaleleri gözden geçirmesi teşvik edilir:
Minimum API'ler ve JSON yükleri
Minimal API çerçevesi, JSON yüklerini almak ve döndürmek için System.Text.Json kullanılarak iyileştirilmiştir.
System.Text.Json:
- JSON ve Yerel AOT için uyumluluk gereksinimleri uygular.
- Kaynak oluşturucunun
System.Text.Jsonkullanılmasını gerektirir.
HTTP gövdesinin bir parçası olarak iletilen veya Minimal API uygulamalarında istek temsilcileri tarafından döndürülen tüm türler, ASP.NET Core'un bağımlılık enjeksiyonu aracılığıyla kaydedilen bir JsonSerializerContext üzerinde yapılandırılmalıdır:
using System.Text.Json.Serialization;
using MyFirstAotWebApi;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Yukarıdaki vurgulanan kodda:
- JSON seri hale getirici bağlamı DI kapsayıcısıyla kaydedilir. Daha fazla bilgi için, şuraya bakın:
-
JsonSerializerContextözelliği,[JsonSerializable]niteliğiyle türToDoiçin kaynak tarafından oluşturulan JSON serileştirici kodunu etkinleştirmek amacıyla açıklanır.
Temsilcide gövdeye bağlı olmayan ve serileştirilebilir olması gerekmeyen bir parametre. Örneğin, IParsable<T>'yı uygulayan ve zengin bir nesne türü olan bir sorgu dizesi parametresi.
public class Todo
{
public int Id { get; set; }
public string? Title { get; set; }
public DateOnly? DueBy { get; set; }
public bool IsComplete { get; set; }
}
static class TodoGenerator
{
private static readonly (string[] Prefixes, string[] Suffixes)[] _parts = new[]
{
(new[] { "Walk the", "Feed the" }, new[] { "dog", "cat", "goat" }),
(new[] { "Do the", "Put away the" }, new[] { "groceries", "dishes", "laundry" }),
(new[] { "Clean the" }, new[] { "bathroom", "pool", "blinds", "car" })
};
// Remaining code omitted for brevity.
Bilinen sorunlar
ASP.NET Core'da Yerel AOT desteğiyle ilgili sorunları bildirmek veya gözden geçirmek için bu GitHub sorununa bakın.
Ayrıca bkz.
- Öğretici: Yerel AOT kullanarak ASP.NET Core uygulaması yayımlama
- Yerel AOT dağıtımı
- AOT dağıtımlarını iyileştirme
- Yapılandırma bağlama kaynak oluşturucu
- Yapılandırma bağlayıcısı için kaynak oluşturucu kullanımı
- Minimum API AOT derleme şablonu
-
Karşılaştırma:
WebApplication.CreateBuilderCreateSlimBuilder - Yeni Minimal API kaynak oluşturucusunu keşfetme
- Yöntem çağrılarını "Interceptor" kullanarak değiştirme
-
Ve yeni telemetri günlüğü kaynak oluşturucusunun arkasında
[LogProperties]
ASP.NET Core