IHttpHandler ve IHttpModule karşılaştırması


81

Sorum basit (cevabı büyük olasılıkla olmayacak olsa da): C # / ASP.NET'te sunucu tarafı karşıya yükleme işleyicisinin nasıl uygulanacağına karar vermeye çalışıyorum.

Hem HttpModules (IHttpModule arabirimi) hem de HttpHandlers (IHttpHandler arabirimi) kullandım ve her iki mekanizmayı kullanarak bunu uygulayabileceğimi fark ettim. İkisi arasındaki farkları anlamadığım da aklıma geliyor.

Öyleyse sorum şu: Hangi durumlarda IHttpModule (ve tersi / tersi) yerine IHttpHandler'ı kullanmayı seçerim?

Biri boru hattında çok daha yüksekte mi yürütülüyor? Belirli durumlarda yapılandırmak çok daha mı kolay? Orta derecede güvenlikle iyi çalışmıyor mu?


3
Cidden LOL, 'Ayrıca ikisi arasındaki farkları anlamadığım da aklıma geliyor.' Güzel bir soru ancak yalnızca bu :) için +1 hak olur
JohnIdol

2
:-) Teşekkürler. Bilmediğim şeyler hakkında dürüst olmanın iyi olduğunu düşünüyorum.
Dan Esparza

1
Sorular olmasaydı cevap olmazdı .. :)
Sprintstar

Yanıtlar:


70

ASP.NET HTTP işleyicisi , bir ASP.NET Web uygulamasına yapılan bir isteğe yanıt olarak çalışan işlemdir (genellikle "uç nokta" olarak adlandırılır). En yaygın işleyici, .aspx dosyalarını işleyen bir ASP.NET sayfa işleyicisidir. Kullanıcılar bir .aspx dosyası talep ettiğinde, istek, sayfa işleyicisi aracılığıyla sayfa tarafından işlenir. Tarayıcıya özel çıktı oluşturan kendi HTTP işleyicilerinizi oluşturabilirsiniz.

Özel HTTP işleyicilerinin tipik kullanımları şunları içerir:

  • RSS beslemeleri Bir Web sitesi için bir RSS beslemesi oluşturmak üzere RSS biçimli XML yayan bir işleyici oluşturabilirsiniz. Daha sonra .rss gibi bir dosya adı uzantısını özel işleyiciye bağlayabilirsiniz. Kullanıcılar sitenize .rss ile biten bir istek gönderdiğinde, ASP.NET, isteği işlemek için işleyicinizi çağırır.
  • Görüntü sunucusu Bir Web uygulamasının görüntüleri çeşitli boyutlarda sunmasını istiyorsanız, görüntüleri yeniden boyutlandırmak için özel bir işleyici yazabilir ve ardından bunları işleyicinin yanıtı olarak kullanıcıya gönderebilirsiniz.

Bir HTTP modülü , uygulamanıza yapılan her istekte çağrılan bir derlemedir. HTTP modülleri, ASP.NET istek kanalının bir parçası olarak çağrılır ve istek boyunca yaşam döngüsü olaylarına erişime sahiptir. HTTP modülleri, gelen ve giden istekleri incelemenizi ve isteğe göre işlem yapmanızı sağlar.

HTTP modülleri için tipik kullanımlar şunları içerir:

  • Güvenlik Gelen istekleri inceleyebileceğiniz için, bir HTTP modülü istenen sayfa, XML Web hizmeti veya işleyici çağrılmadan önce özel kimlik doğrulama veya diğer güvenlik kontrollerini gerçekleştirebilir. Tümleşik modda çalışan Internet Information Services (IIS) 7.0'da, form kimlik doğrulamasını bir uygulamadaki tüm içerik türlerine genişletebilirsiniz.
  • İstatistikler ve günlük kaydı HTTP modülleri her istekte çağrıldığından, istek istatistiklerini ve günlük bilgilerini tek tek sayfalar yerine merkezi bir modülde toplayabilirsiniz.
  • Özel üstbilgiler veya altbilgiler Giden yanıtı değiştirebileceğiniz için, her sayfaya veya XML Web hizmeti yanıtına özel başlık bilgileri gibi içerik ekleyebilirsiniz.

Gönderen: http://msdn.microsoft.com/en-us/library/bb398986.aspx


16

Belirtildiği gibi burada da belirli bir dosya uzantılarına eşlenmesi gerekir, çünkü HttpModules HttpHandlers HttpModules çünkü talep işleme hattından konumlarını sadece farklılık ise talep işleme hattından kendilerini fiş basit sınıfları vardır, ama aynı zamanda.


Bir HttpModule'da iHttpHandler'ı uygulayan bir sınıfa açıkça karar verirseniz, bir işleyiciyi bir uzantıya eşlemenize gerek yoktur
missaghi

@rizzle: "IHttpHandler'ı uygulayan bir sınıfa açıkça çözümleme" ne demek? IHttpModule'ün aynı zamanda bir IHttpHandler olduğunu mu söylüyorsunuz?

3
@Ryan: Modülde HttpApplication.BeginRequest olayına bir yöntem ekleyebilir ve dosya uzantısından bağımsız olarak seçtiğiniz işleyiciyi verebilirsiniz
missaghi

15

IHttpModulesize çok daha fazla kontrol sağlar, temelde Web uygulamanıza yönlendirilen trafiğin tamamını kontrol edebilirsiniz . IHttpHandlersize daha az kontrol sağlar (trafik, işleyicinize ulaşmadan önce filtrelenir ), ancak bu ihtiyaçlarınız için yeterliyse, o zaman IHttpModule.

Her neyse, muhtemelen en iyisi özel mantığınızı ayrı bir sınıfta bulundurmak ve sonra bu sınıfı ya da IHttpModuleveya IHttpHandler. Bu şekilde birini veya diğerini seçme konusunda gerçekten endişelenmenize gerek kalmaz. Aslında, hangi uygular ekstra sınıf oluşturabilir hem IHttpHandler ve IHttpModuleardından bunu ayarlayarak kullanmaya karar Web.config.


Teşekkürler, örneğin uzak istekler için bir web sunucusuna özel kimlik doğrulama eklediğimizi, ancak bunu yerel olanlar için kullanmadığımızı biraz açıklayabilir misiniz?
fkl

5

Modüller, istek işleyici tarafından gerçekten işlenmeden önce ve sonra uygulama tarafından oluşturulan olayları işlemeyi amaçlamaktadır. Öte yandan, işleyicilere herhangi bir uygulama olayına abone olma fırsatı verilmez ve bunun yerine, belirli bir isteği işlemenin "ana" işini gerçekleştirmek için ProcessRequest yöntemini çalıştırır.

Microsoft'un sunduğu bu belgelere bir göz atın ("İstek HttpApplication ardışık düzeni tarafından işleniyor" bölümündeki sayfanın yarısına kadar):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

15. adımda işleyicinin çalıştırma şansını nerede elde ettiğini görebilirsiniz. Bu adımdan önceki ve sonraki tüm olaylar modüller tarafından durdurulabilir, ancak işleyiciler tarafından durdurulamaz.

Başarmaya çalıştığınız belirli özelliklere bağlı olarak, bir yükleme işleyicisini uygulamak için bir işleyici veya bir modül kullanabilirsiniz. Hatta her ikisini de kullanabilirsiniz.

Göz önünde bulundurulması gereken bir şey, önceden yazılmış bir yükleme işleyicisini kullanabilir.

İşte ücretsiz ve açık kaynaklı bir tane:

http://www.brettle.com/neatupload

İşte ticari bir tane:

http://krystalware.com/Products/SlickUpload/

NeatUpload belgelerine bakarsanız, bunun bir modül yapılandırmanızı gerektirdiğini göreceksiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.