.NET Core’da app.Run sonrası kod yürütmek
.NET Core uygulamasında app.Run() sonrasında çalışması gereken işler için uygulama yaşam döngüsünü dikkate alan kısa çözüm notu.
Bazı işlerin uygulama açılırken yalnız bir kez yapılması gerekir: önbelleği doldurmak, ayarları okumak, veri tabanı bağlantısını sınamak, arka plan görevini başlatmak. Bunu her isteğe koyarsanız iş tekrar tekrar yapılır.
Aşağıdaki örnek bunu bir ara katman (middleware) üzerinden çözüyor: sınıf içinde bir bayrak tutuluyor, iş yalnız ilk istekte çalışıyor, sonraki istekler doğrudan geçiyor. Ara katman nesnesi uygulama ömrü boyunca tek örnek olduğu için bayrak kalıcıdır.
Dikkat edilecekler
- İlk istek açılış işini bekleyeceği için diğerlerinden yavaş olur. İş uzunsa isteği bekletmek yerine arka plana almak daha doğrudur.
- Aynı anda gelen iki istek bayrağı aynı anda okuyabilir; işin gerçekten tek kez çalışması şartsa kilitleme gerekir.
- Modern .NET'te bu iş için
IHostedServicegibi hazır bir yol da vardır; ara katman çözümü, açılış işinin istek boru hattına bağlı olduğu durumlarda tercih edilir.
Öncelikle bir middleware sınıf tanımlayalım.
public class StartUp
{
private readonly RequestDelegate next;
private bool running = false;
public StartUp(RequestDelegate next)
{
this.next = next;
}
public Task Invoke(HttpContext httpContext)
{
if (!running)
{
//Çalıştırmak istediğimiz kodlar
running = true;
}
return next(httpContext);
}
}
Şimdi bu sınıfımızı Program.cs dosyamıza ekleyelim.
Ekleyeceğimiz kısım tercihen app.Run() ifadesinden hemen önce olmalıdır.
app.UseMiddleware
app.Run();
Bu işlemden sonra middleware sınıfımız projemize tanımlanacak ve .Net Core platformunun yaşam döngüsü gereği her istekte invoke edilecektir.
En son eklememizin sebebi ise daha önceki işlemlerde oluşabilecek tanımlara erişmekte sıkıntı yaşamamak için. (Özel bir anlamı yok :))
Kısa rehber
Ne zaman kullanılır?
app.Run sonrası kod çalıştırma ihtiyacı genellikle servis kapanırken temizlik yapmak, log kapatmak veya arka plan işlemini düzgün sonlandırmak için ortaya çıkar. Bu kodun ne zaman çalışacağını bilmek önemlidir.
Dikkat edilecekler
- Uygulama yaşam döngüsünü ve host kapanış davranışını net anlayın.
- Kapanış sırasında uzun süren işlemleri kontrolsüz bırakmayın.
- BackgroundService veya hosted service daha doğruysa ana akışı zorlamayın.
Sık yapılan hata
app.Run sonrasına kritik iş koyup onun her zaman çalışacağını varsaymak doğru değildir. Ani kapanma, hata veya sunucu kesintisinde bu kod hiç çalışmayabilir.
Kalıcı çözüm için not
Hata çözümü yaparken yalnız hata mesajını kapatmak yeterli değildir. Sürüm, işletim sistemi, bağımlılıklar, karakter kodlaması, sunucu ayarı ve log kayıtları birlikte incelenmelidir. Kalıcı çözüm için hatanın çıktığı ortamı, bağımlılıkları ve veri akışını birlikte değerlendirmek daha sağlıklı sonuç verir.