HTTPModule ve HTTPHandler

Eyl 08, 2013

ASP.NET İş Akışı

ASP.NET iş akış süreci, gelen bütün isteklerin ASP.NET tarafından iş akışı üzerinde bulunan birimlere (module) iletilmesiyle başlar. Her birim gelen isteği aldıktan ve istek üzerindeki tüm yetkiyi elde ettikten sonra, en uygun hale gelinceye kadar istek üzerinde işlem yapar. İstek bütün HTTPModule yapılarından geçtikten sonra ilgili HTTPHandler'a iletilir. HTTPHandler istek üzerinde bazı işlemler yaptıktan sonra, isteğe verilen cevap ASP.NET iş akışında isteğin geldiği HTTPModule yapıları aracılığıyla iletilir.

ASP.NET Runtime tarafından gelen isteklerde birden fazla HTTPModule kullanılmasının sebebi, Web uygulamalarında kullanılan Cache (ara belleğe alma), Session (kullanıcı tarafından oluşturulan oturum), Authentication (kimlik doğrulama) nesnelerinin her biri için farklı bir HTTPModule kullanılıyor olmasıdır. HTTPHandler ise HTTPModule yapılarından gelen bilgileri kullanarak uygun html çıktısını üreterek aynı HTTPModule yapıları üzerinden ASP.NET Runtime'a iletilir.


                    


HTTPModule ve HTTPHandler yapılarının işlevleri, bir kullanıcının sunucuya istekte bulunması ve bu isteğin sunucudan kullanıcıya geri dönmesi çerçevesinde incelenebilir.

ISAPI(Internet Server Application Programming Interface / İnternet Sunucu Uygulamalarını Programlama Servisi ), Web sunucularını geliştirmeye yarayan bir teknolojidir. IIS (Internet Information Service / İnternet Bilgi Servisi) de, Web sayfaları istekleri için Microsoft tarafından yazılmış, ISAPI uyumlu bir Web sunucusudur. IIS tarafından gelen isteklere göre önce dosya uzantısına bakılır ve sonra gerekli yerlere istek gönderilir. Daha sonra, IIS bu harici http motorlarından dönecek cevabı bekler, cevap döndüğü zaman bu cevabı kullanıcıya gönderir. IIS; css, html ya da jv gibi statik Web dosyaları için,istekleri harici motorlara iletmez ve kendisi okuyup kullanıcıya döndürür. IIS isteklerinin iletilmesi aşamasında bir aspx sayfası html formatında cevap döndürür, asmx (Web service) sayfası ise soap formatında cevap döndürür. Yani her sayfa, farklı şekilde cevap olarak döner. Bu farklılıktan dolayı IIS, istek gönderirken bir arayüze ihtiyaç duyabilir.Kullanıcı bir asp sayfası istiyorsa, asp.dll Isapi uzantısı kullanılır. Bir ASP.NET sayfası söz konusu olduğunda ise bu uzantı asp.net_Isapi.dll kütüphanesidir. Bu kütüphanede .NET Framework kodları çalıştırılamaz. Bu yüzden, gelen istekler ASP.NET Web uygulamalarını çalıştıran ve yöneten Asp.Net Work Processor’a iletilir. Asp.Net Work Processor, gelen talepleri HTTPModule'ler üzerinden geçirir ve ilgili olan HTTPHandler'a gonderir. 

Web sunucusuna istek gönderildikten sonra, sunucu bu istekleri ilgili filtrelere gönderir. İstekler filtreler tarafından düzenlenir ve kayıtları alınır. C ya da C++ ile bu tip işlemleri programa eklemek oldukça zor iken, ASP.NET ile gelen HttpModule ve HttpHandler yenilikleri ile isteklerin ilgili yerlere gönderilmesi ve işleme konulması kolaylaştırılmıştır.


        

HTTPHandler

HTTPHandler sınıfları, belirli bir tür dosyayı derleyen, çalıştıran, sonucu üreten ve ürettiği sonucu geri döndüren sınıflardır. HTTPHandler, IIS’den sonraaspnet_isapi.dll tarafından bir kez daha dosya uzantısı kontrolü yapılarak bulunur ve dosya uzantısına göre gerekli cevap verecek HTTPHandler sınıfı bulunup cevap verme işi bu sınıfa devredilir. Örneğin, aspx dosyalarını System.Web.UI.PageHandlerFactory handler sınıfı çalıştırırken, asmx dosyalarınıSystem.Web.Services.Protocols.WebServiceHandlerFactory sınıfı çalıştırır. Kullanıcı tarafından görünmesi istenmeyen .cs ve .vb gibi dosyalar için iseSystem.Web.HttpForbiddenHandler handler sınıfı cevap verir. Asp.net_isapi.dll’in hangi http motorlarını çalıştırdığı da Web.config dosyasından bulunabilir. Web.config dosyası her bir ASP.NET Web uygulamasının kök (root) klasöründe bulunur ve sadece o uygulamaya ait yapılandırma ayarlarını içerir. Herhangi bir ayar Web.config dosyasında değiştirilmiş ise, o uygulamada Web.config dosyasındaki değer kullanılır. ASP.NET HTTPHandler ayarları, o dosyanın <httpHandlers> etiketi (tag) içinde bulunur. Handler sınıfları daha ayrıntılı açıklanmak istenirse aspx sayfalarının nasıl oluştuğuna bakılabilir. Aspx olarak yazdığımız kodlar derlenirken arka plan kodlarıyla birleştirilip sadece bir tek sınıf olarak derlenir. Yani ön planda yazılan <asp:TextBox> gibi etiketler kod olarak TextBox sınıfına çevrilir, ve tek bir arka plan kodu üretilir. Üretilen bu sınıf aslında bir HTTPHandler'dır. Örneğin, görünmesini istenmeyen bir dosyanın Web.config kısmındaki etiketin içine gelerek <add verb="*" path="*.DosyaUzantısı" type="System.Web.HttpForbiddenHandler" /> yazılırsa dosya kullanıcılardan saklanabilir. Burada dikkat edilmesi gereken nokta, görünmesi istenmeyen dosyanın asp.net_isapi.dll tarafından cevaplanacağının yapılandırmada belirtilmesi gerektiğidir.

Bunların dışında, kendi HTTPHandler ya da HTTPModule yapılarımızı oluşturmak da mümkündür. HTTPHandler oluşturabilmek için öncelikle IHTTPHandler arayüzünü oluşturacak olan bir sınıf yazılması gerekmektedir. Örneğin, ilk olarak bu ve benzeri HTTPModule ya da HTTPHandler yapılarını içerisinde bulunduracak küçük bir sınıf kütüphanesi (Class Library) projesi oluşturulur. Böylece bu HTTPHandler ya da HTTPModule çeşitleri başka Web uygulamaları için de kullanılabilir. Hatta bu proje GAC (Global Assembly Cache) içerisine atıldığında her Web uygulamasının ortaklaşa olarak erişebileceği bir dll haline de getirilmiş olur. Class Library projesinde kullanılacak HTTPHandler  ya da HTTPModule çeşitleri içerisinden güncel Web içeriklerine (Http Context) erişebilmek için System.Web referansı eklenmek zorundadır.





HTTPModule

HTTPModule kavramı ise şimdi daha kolay bir şekilde açıklanabilir. Asp.net_isapi.ddl kütüphanesinin kodları çalıştırmadığı ve köprü görevi üstlendiği daha önce belirtilmişti. Bu kütüphane asp.net.isapi doysa uzantılarını tekrar kontrol ettikten sonra gelen istekleri Asp.net Work Processor'a iletir. Asp.net Work Processor ise gelen isteği işlemek üzere tüm HTTPModule'lere  iletir. Her modül bu isteği inceler ve ilgili olduğuna karar verdiği HTTPHandler’a iletir. Yani bir sayfa HTTPHandler’a ulaşmadan önce HTTPModule’lerden geçer. HTTPHandler'dan gelen html çıktıları tekrar HTTPModule’lere gelerek oradan harici asp motorlarına geri gelir. HTTPModules içerisinde tanımlanan elementlerde belirtilen Cache (ara belleğe alma), Session (kullanıcı tarafından oluşturulan oturum), Authentication (kimlik doğrulama), Role yönetimi gibi türler "framework" özelliklerinin kullanılmasını sağlar. Böylece, bir sayfa için gerekli olan ara belleğe alma, belleğe html çıktısını dahil etme, session bilgisini oluşturma veya güvenlik doğrulama gibi işlemler ilgili HTTPModule tarafından ele alınır. OutputCacheModule, SessionStateModule,WindowsAuthenticationModule, FormsAuthenticationModule HTTPModule yapısına örnek olarak gösterilebilir.