Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 16308|Yanıt: 0

[ASP.NET] [Efsane] HttpApplication nesnesi Init metodu sadece bir kez mi çalıştırılır?

[Bağlantıyı kopyala]
Yayınlandı 6.02.2017 17:29:28 | | | |
Benim gibi birçok arkadaşımın bazı uygulama başlatma işlemlerini yapmak için IHttpModule.Init'i Application_Start bir alternatif olarak yanlışlıkla kullandığını fark ettim.
Ancak, IHttpModule.Init ve Global.asax'taki Application_Start olaylarının doğası farklıdır ve IHttpModule.Init, uygulamanın başlatma sürecini doğrudan Application_Start ASP.NET yerine koymak için kullanılamaz. Ayrıca, Init yönteminin tekrar tekrar çağrıldığı sonucuna varmak için de kullanılamaz ASP.NET bu yöntem programın yeniden başlatıldığına karar vermek için kullanılamaz.
Bunun nedeni, bir isteğe yanıt verirken IHttpModule.Init ASP.NET birden fazla kez çağrılabileceği ve bunun gerçek web sitesi işlemi sırasında gerçekleşmesi çok muhtemeldir.
IHttpModule.Init neden birden fazla kez çağrılır çünkü her HttpApplication örneği aynı anda yalnızca bir isteği yönetebilir ve ASP.NET belirli sayıda eşzamanlı isteği destekler; bu nedenle HttpApplication örneği, eşzamanlı taleplere yanıt vermediğinde farklı taleplere yanıt vermek üzere birden fazla kez oluşturulur. Her HttpApplication örneği yeni bir HttpModule seti oluşturur ve oluşturulduktan sonra Init metodunu çağırır.
Application_Start yalnızca ilk HttpApplication nesnesi oluşturulduktan sonra çağrılır ve sonraki HttpApplication örnekleri bu olayı tetiklemez.
Bence HttpApplication örneklerinin yeniden kullanımı, IHttpModule'un Init yönteminin yanlış anlaşılmasının başlıca nedeni, çünkü genellikle bir programı hata ayıklama yaparken sadece bir istek olur ve HttpModule'un Init metodunu tekrar tekrar çalıştırmak neredeyse imkansızdır. Gerçek web sitesi çalışma ortamında, eşzamanlı talepler yaygındır ve Init yöntemi kötüye kullanılırsa, ortamda garip sorunlar yaratabilir.
Özel detaylar için lütfen MSDN'nin "IIS 5.0 ve 6.0 için ASP.NET Uygulama Yaşam Döngüsü Görünümü"ne bakınız; makalede görseller yer almaktadır:
Ayrıca Refelector kullanarak System.Web assembly derlemesini çözebilir ve IHttpModule.Init metodunun çağrı ilişkisini analiz edebilirsiniz.
Sonunda System.Web.HttpApplicationFactory.GetNormalApplicationInstance metodu ile karşılaşırsınız; bu yöntem HttpApplication örneklerinin nasıl yeniden kullanıldığını ve nasıl oluşturulduğunu gösterir.
Özetle, IHttpModule.Init sadece Application_Start'nin yerine geçemez.
Görece basit bir yol, başlatma etiketi olarak statik bir bool türü alanı kullanmak ve programın HttpModule'deki başlatma işlemi sonrası işareti true olarak ayarlamak ve bir dahaki sefere başlatmayı tekrarlamamaktır.
Ancak, BeginRequest olayını kaydetme gibi kodlar yine de Init çalıştırıldığında her seferinde çalıştırılmak zorunda, çünkü bu anda HttpModule örneği farklıdır; statik başlatma işaretleme alanını kayıt olayı tekrarlamadan değerlendirirseniz, bazen çalıştırılıp bazen çalıştırılmayan URL yeniden yazma gibi garip sorunlara yol açar.

[Efsane] HttpApplication nesnesi Init metodu sadece bir kez mi çalıştırılır?

Cevap: Birden fazla kez uygulanacak!!!!





Önceki:InternalsVisibleTo kullanarak assembly üzerine "friend assembly" ekleyin
Önümüzdeki:Güzel bir sayı seçmek için Java regex yarışması
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com