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.
Bu makalede, Razor bileşenlerinin sunucu tarafından işlendiği Blazor Web App içindeki ön işleme senaryoları açıklanmaktadır.
Ön kayıt , işlenen denetimler için olay işleyicilerini etkinleştirmeden başlangıçta sunucudaki sayfa içeriğini işleme işlemidir. Sunucu, uygulamanın kullanıcılara daha duyarlı hissetmesini sağlayan ilk isteğe yanıt olarak sayfanın HTML kullanıcı arabirimini mümkün olan en kısa sürede verir. Ön kayıt, arama motorlarının sayfa derecesini hesaplamak için kullandığı ilk HTTP yanıtının içeriğini işleyerek Arama Altyapısı İyileştirmesini (SEO) da geliştirebilir.
** Önceden oluşturulmuş durumu kalıcı hale getirmek
Önceden girilmiş durum kalıcı olmadan, ön kayıt sırasında kullanılan durum kaybolur ve uygulama tamamen yüklendiğinde yeniden oluşturulması gerekir. Herhangi bir durum zaman uyumsuz olarak oluşturulursa, önceden renderlanmış kullanıcı arabirimi bileşen yeniden renderlandığında değiştirildiği için kullanıcı arabirimi titreyebilir.
Aşağıdaki PrerenderedCounter1
sayaç bileşenini göz önünde bulundurun. Bileşen, yaşam döngüsü yöntemindeOnInitialized
ön kayıt sırasında ilk rastgele sayaç değerini ayarlar. İstemciye SignalR bağlantı kurulduktan sonra bileşen yeniden oluşturulur ve OnInitialized
ikinci kez yürütüldüğünde başlangıçta verilen sayı değeri değiştirilir.
PrerenderedCounter1.razor
:
@page "/prerendered-counter-1"
@rendermode @(new InteractiveServerRenderMode(prerender: true))
@inject ILogger<PrerenderedCounter1> Logger
<PageTitle>Prerendered Counter 1</PageTitle>
<h1>Prerendered Counter 1</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
protected override void OnInitialized()
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
private void IncrementCount() => currentCount++;
}
Uygulamayı çalıştırın ve bileşendeki günlüğü inceleyin. Aşağıda örnek çıkış verilmiştir.
Not
Uygulama etkileşimli yönlendirmeyi benimserse ve sayfaya dahili gelişmiş bir gezinti yoluyla ulaşılırsa, ön kayıt gerçekleşmez. Bu nedenle, aşağıdaki çıkışı görmek için bileşenin PrerenderedCounter1
tam sayfa yeniden yüklemesini gerçekleştirmeniz gerekir. Daha fazla bilgi için Etkileşimli Yönlendirme ve Ön İşleme bölümüne bakın.
info: BlazorSample.Components.Pages.PrerenderedCounter1[0]
currentCount set to 41
info: BlazorSample.Components.Pages.PrerenderedCounter1[0]
currentCount set to 92
İlk günlüğe kaydedilen sayı, ön işleme sırasında gerçekleşir. Bileşen tekrar render edildiğinde, ön render sonrasında sayı yeniden ayarlanır. Ayrıca, sayı 41'den 92'ye güncelleştirildiğinde kullanıcı arabiriminde bir titreşim de vardır.
Ön kayıt sırasında sayacın ilk değerini korumak için, Blazor hizmeti kullanarak önceden oluşturulmuş bir sayfada durumun kalıcı olmasını destekler (Sayfalar veya MVC uygulamalarının PersistentComponentState sayfalarına veya görünümlerine eklenmiş bileşenler için Razor).
Önceden işlenmiş durumu korumak için, durumu özelliklerde kalıcı hale getirmek üzere [SupplyParameterFromPersistentComponentState]
özniteliğini kullanın. Bu özniteliğe sahip özellikler, önceden işleme sırasında PersistentComponentState servisi kullanılarak otomatik olarak kalıcı hale getirilir. Durum, bileşen etkileşimli olarak işlendiğinde veya hizmet örneği başlatıldığında alınır.
Varsayılan olarak, özellikler varsayılan ayarlarla System.Text.Json seri hale getirici kullanılarak serileştirilir. Serileştirme, düzelticilerle güvenli değildir ve kullanılan türlerin korunması gerektirir. Daha fazla bilgi için bkz ASP.NET Core için Düzeltici'yi Ayarlama Blazor.
Aşağıdaki sayaç bileşeni, ön işleme sırasında sayaç durumunu kalıcı kılar ve bileşeni başlatmak için bu durumu geri yükler.
-
[SupplyParameterFromPersistentComponentState]
özniteliği türüneCounterState
(State
) uygulanır. - Sayacın durumu,
null
içindekiOnInitialized
olduğunda atanır ve bileşen etkileşimli bir şekilde görüntülendiğinde otomatik olarak geri yüklenir.
PrerenderedCounter2.razor
:
@page "/prerendered-counter-2"
@inject ILogger<PrerenderedCounter2> Logger
<PageTitle>Prerendered Counter 2</PageTitle>
<h1>Prerendered Counter 2</h1>
<p role="status">Current count: @State?.CurrentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
[SupplyParameterFromPersistentComponentState]
public CounterState? State { get; set; }
protected override void OnInitialized()
{
if (State is null)
{
State = new() { CurrentCount = Random.Shared.Next(100) };
Logger.LogInformation("CurrentCount set to {Count}",
State.CurrentCount);
}
else
{
Logger.LogInformation("CurrentCount restored to {Count}",
State.CurrentCount);
}
}
private void IncrementCount()
{
if (State is not null)
{
State.CurrentCount++;
}
}
public class CounterState
{
public int CurrentCount { get; set; }
}
}
Bileşen çalıştığında, CurrentCount
önceden işleme sırasında yalnızca bir kez belirlenir. Bileşen yeniden başlatıldığında değer geri yüklenir. Aşağıda örnek çıkış verilmiştir.
Not
Uygulama etkileşimli yönlendirmeyi benimserse ve sayfaya dahili gelişmiş bir gezinti yoluyla ulaşılırsa, ön kayıt gerçekleşmez. Bu nedenle, aşağıdaki çıkışı görmek için bileşenin tam sayfa yeniden yüklemesini gerçekleştirmeniz gerekir. Daha fazla bilgi için Etkileşimli Yönlendirme ve Ön İşleme bölümüne bakın.
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
CurrentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
CurrentCount restored to 96
Aşağıdaki örnekte, aynı türdeki birden çok bileşenin durumunu seri hale getiren:
-
[SupplyParameterFromPersistentComponentState]
özniteliğiyle açıklama eklenmiş özellikler, ön izleme sırasında seri hale getirilir ve seri durumdan çıkarılır. -
@key
yönerge özniteliği, durumun bileşen örneğiyle doğru şekilde ilişkilendirildiğinden emin olmak için kullanılır. -
Element
özelliği, sorgu parametreleri ve form verileri için null referanslardan nasıl kaçınıldığına benzer şekilde null referans hatalarını önlemek amacıyla yaşam döngüsü yöntemiOnInitialized
içinde başlatılır.
PersistentChild.razor
:
<div>
<p>Current count: @Element.CurrentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</div>
@code {
[SupplyParameterFromPersistentComponentState]
public State Element { get; set; }
protected override void OnInitialized()
{
Element ??= new State();
}
private void IncrementCount()
{
Element.CurrentCount++;
}
private class State
{
public int CurrentCount { get; set; }
}
}
Parent.razor
:
@page "/parent"
@foreach (var element in elements)
{
<PersistentChild @key="element.Name" />
}
Bağımlılık ekleme hizmetinin durumunu seri hale getiren aşağıdaki örnekte:
- Özniteliği
[SupplyParameterFromPersistentComponentState]
ile işaretlenmiş özellikler, ön işleme sırasında seri hale getirilir ve uygulama etkileşimli hale geldiğinde seri durumdan çıkarılır. -
AddPersistentService
yöntemi, hizmeti kalıcılık için kaydetmek için kullanılır. İşleme modu, hizmet türünden çıkarılamadığı için gereklidir. Aşağıdaki değerlerden herhangi birini kullanın:-
RenderMode.Server
: Hizmet, Etkileşimli Sunucu işleme modu için kullanılabilir. -
RenderMode.Webassembly
: Hizmet, Etkileşimli Webassembly işleme modu için kullanılabilir. -
RenderMode.InteractiveAuto
: Bir bileşen bu modlardan birinde işlenirse hizmet hem Etkileşimli Sunucu hem de Etkileşimli Webassembly işleme modları için kullanılabilir.
-
- Hizmet, etkileşimli rendere taşıma modunun başlatılması aşamasında çözülür ve
[SupplyParameterFromPersistentComponentState]
özniteliği ile ek açıklama içeren özellikler deserile edilir.
Not
Yalnızca kalıcı kapsamlı hizmetler desteklenir.
CounterService.cs
:
public class CounterService
{
[SupplyParameterFromPersistentComponentState]
public int CurrentCount { get; set; }
public void IncrementCount()
{
CurrentCount++;
}
}
Program.cs
'da:
builder.Services.AddPersistentService<CounterService>(RenderMode.InteractiveAuto);
Serileştirilmiş özellikler gerçek hizmet örneğinden tanımlanır:
- Bu yaklaşım soyutlamanın kalıcı bir hizmet olarak işaretlenmesine olanak tanır.
- Gerçek uygulamaların iç veya farklı türler olmasını sağlar.
- Farklı derlemelerde paylaşılan kodu destekler.
- Her örnek aynı özellikleri açığa çıkarır.
Özniteliğiyle [SupplyParameterFromPersistentComponentState]
durumu kalıcı hale getirmek için bildirim temelli modeli kullanmaya alternatif olarak, hizmeti doğrudan kullanabilirsiniz PersistentComponentState ve bu da karmaşık durum kalıcılığı senaryoları için daha fazla esneklik sunar. Ön işleme sırasında bileşen durumunu sabitlemek için PersistentComponentState.RegisterOnPersisting çağırarak bir geri çağırma kaydedin. Bileşen etkileşimli olarak yeniden işlendiğinde, durum geri yüklenir. Uygulama kapatma sırasında olası bir yarış durumundan kaçınmak için başlatma kodunun sonunda aramayı yapın.
Aşağıdaki sayaç bileşeni örneği, önceden render etme sırasında sayaç durumunu saklar ve bileşeni başlatmak için durumu geri yükler.
PrerenderedCounter3.razor
:
@page "/prerendered-counter-3"
@implements IDisposable
@inject ILogger<PrerenderedCounter3> Logger
@inject PersistentComponentState ApplicationState
<PageTitle>Prerendered Counter 3</PageTitle>
<h1>Prerendered Counter 3</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
private PersistingComponentStateSubscription persistingSubscription;
protected override void OnInitialized()
{
if (!ApplicationState.TryTakeFromJson<int>(
nameof(currentCount), out var restoredCount))
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
else
{
currentCount = restoredCount!;
Logger.LogInformation("currentCount restored to {Count}", currentCount);
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistCount);
}
private Task PersistCount()
{
ApplicationState.PersistAsJson(nameof(currentCount), currentCount);
return Task.CompletedTask;
}
private void IncrementCount() => currentCount++;
void IDisposable.Dispose() => persistingSubscription.Dispose();
}
Bileşen çalıştığında, currentCount
önceden işleme sırasında yalnızca bir kez belirlenir. Bileşen yeniden başlatıldığında değer geri yüklenir. Aşağıda örnek çıkış verilmiştir.
Not
Uygulama etkileşimli yönlendirmeyi benimserse ve sayfaya dahili gelişmiş bir gezinti yoluyla ulaşılırsa, ön kayıt gerçekleşmez. Bu nedenle, aşağıdaki çıkışı görmek için bileşenin tam sayfa yeniden yüklemesini gerçekleştirmeniz gerekir. Daha fazla bilgi için Etkileşimli Yönlendirme ve Ön İşleme bölümüne bakın.
info: BlazorSample.Components.Pages.PrerenderedCounter3[0]
currentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter3[0]
currentCount restored to 96
Önceden oluşturulmuş durumu korumak için, hizmeti kullanarak PersistentComponentState hangi durumun kalıcı hale dönüştürüleceğine karar verin. PersistentComponentState.RegisterOnPersisting ön kayıt sırasında bileşen durumunu kalıcı hale getirmek için bir geri çağırma kaydeder. Bileşen etkileşimli olarak yeniden işlendiğinde, durum geri yüklenir. Uygulama kapatma sırasında olası bir yarış durumundan kaçınmak için başlatma kodunun sonunda aramayı yapın.
Aşağıdaki sayaç bileşeni örneği, önceden render etme sırasında sayaç durumunu saklar ve bileşeni başlatmak için durumu geri yükler.
PrerenderedCounter2.razor
:
@page "/prerendered-counter-2"
@implements IDisposable
@inject ILogger<PrerenderedCounter2> Logger
@inject PersistentComponentState ApplicationState
<PageTitle>Prerendered Counter 2</PageTitle>
<h1>Prerendered Counter 2</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
private PersistingComponentStateSubscription persistingSubscription;
protected override void OnInitialized()
{
if (!ApplicationState.TryTakeFromJson<int>(
nameof(currentCount), out var restoredCount))
{
currentCount = Random.Shared.Next(100);
Logger.LogInformation("currentCount set to {Count}", currentCount);
}
else
{
currentCount = restoredCount!;
Logger.LogInformation("currentCount restored to {Count}", currentCount);
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistCount);
}
private Task PersistCount()
{
ApplicationState.PersistAsJson(nameof(currentCount), currentCount);
return Task.CompletedTask;
}
void IDisposable.Dispose() => persistingSubscription.Dispose();
private void IncrementCount() => currentCount++;
}
Bileşen çalıştığında, currentCount
önceden işleme sırasında yalnızca bir kez belirlenir. Bileşen yeniden başlatıldığında değer geri yüklenir. Aşağıda örnek çıkış verilmiştir.
Not
Uygulama etkileşimli yönlendirmeyi benimserse ve sayfaya dahili gelişmiş bir gezinti yoluyla ulaşılırsa, ön kayıt gerçekleşmez. Bu nedenle, aşağıdaki çıkışı görmek için bileşenin tam sayfa yeniden yüklemesini gerçekleştirmeniz gerekir. Daha fazla bilgi için Etkileşimli Yönlendirme ve Ön İşleme bölümüne bakın.
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
currentCount set to 96
info: BlazorSample.Components.Pages.PrerenderedCounter2[0]
currentCount restored to 96
Ön kayıt sırasında kullanılan durumla aynı duruma sahip bileşenleri başlatarak, pahalı başlatma adımları yalnızca bir kez yürütülür. İşlenen kullanıcı arabirimi önceden oluşturulmuş kullanıcı arabirimiyle de eşleşir, bu nedenle tarayıcıda titreme olmaz.
Kalıcı önceden oluşturulmuş durum, bileşen durumunu geri yüklemek için kullanıldığı istemciye aktarılır. İstemci tarafı işleme (CSR, InteractiveWebAssembly
) sırasında veriler tarayıcıya sunulur ve hassas, özel bilgiler içermemelidir. Etkileşimli sunucu tarafı işleme sırasında (etkileşimli SSR, InteractiveServer
), ASP.NET Core Data Protection verilerin güvenli bir şekilde aktarılmasını sağlar. İşleme InteractiveAuto
modu WebAssembly ve Sunucu etkileşimini birleştirir, bu nedenle CSR örneğinde olduğu gibi verilerin tarayıcıya açık olmasını göz önünde bulundurmanız gerekir.
Sayfalara ve görünümlere eklenmiş bileşenler (Razor Sayfalar/MVC)
Bir Sayfalar veya MVC uygulaması sayfasına ya da görünümüne eklenmiş bileşenler için, uygulamanın düzeni kapanış Razor etiketinin içine HTML etiketiyle birlikte <persist-component-state />
eklemelisiniz. Bu yalnızca Sayfalar ve MVC uygulamaları için Razor gereklidir. Daha fazla bilgi için bkz . ASP.NET Core'da Kalıcı Bileşen Durum Etiketi Yardımcısı.
Pages/Shared/_Layout.cshtml
:
<body>
...
<persist-component-state />
</body>
Etkileşimli yönlendirme ve ön kayıt
Routes
bileşeni bir işleme modu tanımlamadığında, uygulama sayfa başına/bileşen etkileşimini ve gezintiyi kullanıyordur. Sayfa başına/bileşen gezintisi kullanıldığında, uygulama etkileşimli hale geldikten sonra iç† gezinti gelişmiş yönlendirme tarafından işlenir. bu bağlamda †Internal , gezinti olayının URL hedefinin uygulamanın içindeki bir Blazor uç nokta olduğu anlamına gelir.
PersistentComponentState hizmeti yalnızca ilk sayfa yüklemesinde çalışır ve iç gelişmiş sayfa gezinti olaylarında çalışmaz.
Uygulama, kalıcı bileşen durumunu kullanan bir sayfada tam (gelişmiş olmayan) bir gezinti gerçekleştirirse, kalıcı durum uygulamanın etkileşimli hale geldiğinde kullanması için kullanılabilir hale gelir.
Etkileşimli bir devre önceden oluşturulmuşsa ve kalıcı bileşen durumunu kullanan bir sayfaya gelişmiş bir gezinti gerçekleştiriliyorsa, bileşeninkullanabilmesi için durum
.NET 10 (Kasım 2025) için Blazor çerçevesi üzerinde bu senaryoyu ele alan ek çalışmalar dikkate alınmalıdır.
Desteklenmeyen geçici çözümler hakkında daha fazla bilgi ve topluluk tartışması için bkz. Gelişmiş sayfa gezintilerinde kalıcı bileşen durumunu destekleme (dotnet/aspnetcore
#51584). ‡Desteklenmeyen geçici çözümler microsoft tarafından Blazor uygulamalarında kullanılmak üzere tasdik edilmemiştir.
Riski size ait olan üçüncü taraf paketleri, yaklaşımları ve kodları kullanın.
Gelişmiş gezintiyi devre dışı bırakmak, performansı düşürür ancak aynı zamanda iç sayfa isteklerinde PersistentComponentState yükleme durumu sorununu önler ve bu konu ASP.NET Core Blazor yönlendirme ve gezinti bölümünde ele alınmıştır.
Veriyolu Ön İşleme Kılavuzu
Hazırlama kılavuzu, belgelerde konulara Blazor göre düzenlenmiştir. Aşağıdaki bağlantılar, konuya göre ayarlanan belgelerde yer alan tüm ön kayıt kılavuzlarını kapsar:
Temel Bilgiler
- Genel Bakış: İstemci ve sunucu işleme kavramları
- Yönlendirme
- Statik ve etkileşimli yönlendirme
- Birden çok derlemeden bileşenlere yönlendirme: Etkileşimli yönlendirme
-
OnNavigateAsyncön kayıt sırasında iki kez yürütülür: ile zaman uyumsuz gezinti olaylarını
OnNavigateAsync
işleme
- Başlangıç
- Ortamlar: Ortamı istemci tarafında okuma Blazor Web App
- Hataları İşleme: Ön İşleme
- SignalR
Bileşenler
-
Ön kayıt sırasında içeriği denetleme
<head>
- İşleme modları
-
Razor prerendering ile ilgili bileşen yaşam döngüsü konuları
-
Bileşen başlatma (
OnInitialized{Async}
) -
Bileşenin işlenmesinden sonra (
OnAfterRender{Async}
) - Prerendering sonrasında durumsal yeniden bağlantı
- JavaScript birlikte çalışabilirliği ile önceden render etme: Bu bölüm, JavaScript'i .NET'ten çağırma ve JavaScript'ten .NET'i çağırma ile ilgili iki JS birlikte çalışabilirlik makalesinde de yer almaktadır.
- İşleme sırasında tamamlanmamış zaman uyumsuz eylemleri işleyin: Sunucuda önceden işleme sırasında uzun süre çalışan yaşam döngüsü işlemleri nedeniyle geciken işleme için kılavuz.
-
Bileşen başlatma (
-
QuickGrid
bileşen örnek uygulaması: QuickGrid Örnek uygulama içinBlazor, GitHub Sayfalarında barındırılır. Topluluk tarafından korunanBlazorWasmPrerendering.Build
GitHub projesini kullanarak statik ön kayıt sayesinde site hızla yüklenir. - Bileşenleri Sayfalar ve MVC uygulamalarıyla Razor tümleştirirken önceden oluşturma
-
Ön kayıt sırasında içeriği denetleme
Dosya yüklemeleri: İstemci tarafı işleme (CSR) ile bir sunucuya dosya yükleme
Kimlik doğrulaması ve yetkilendirme
- Sunucu tarafı tehdit azaltma: Siteler arası komut dosyası çalıştırma (XSS)
- Blazor sunucu tarafı güvenliğine genel bakış
-
Blazor sunucu tarafı ek senaryoları: Belirteçleri okuma
HttpContext
- Blazor WebAssembly genel bakış: Prerendering desteği
- Blazor WebAssembly ek senaryolar
- Etkileşimli sunucu tarafı işleme: Siteler arası komut dosyası çalıştırma (XSS)
Durum yönetimi: Ön render işlemi: Ön render işle bölümünün yanı sıra, makalenin diğer bölümlerinden bazıları ön render ile ilgili açıklamalar içerir.
.NET 7 veya daha önceki sürümler için bkz Blazor WebAssembly . Güvenlikle ilgili ek senaryolar: Kimlik doğrulaması ile önceden giriş. Bu bölümdeki içeriği görüntüledikten sonra, sonraki ziyaretlerde belge sayfalarının en son .NET sürümüyle yüklenmesini sağlamak için, sürüm seçici açılan listesini en yeni .NET sürümüne sıfırlayın.
ASP.NET Core