Makale Özeti

Bu yazımızda Windows Server 2008 ile beraber gelen IIS 7.0 ile ASP.NET tarafında yeniliklerden bahsederkenufak bir HttpModule örneği yapıyoruz.

Makale

Server 2008 ile beraber IIS 7.0'ın gelmesi özellikle ASP.NET geliştiricileri için büyük kolaylıklar sunuyor. Bu yazımda sizlere bu kolaylıklardan ufak bir demet sunarken özellikle HttpModule yazma ve IIS 7.0 tarafında kullanma konusuna değineceğim.

Web.Config içindeki hazine

Web.Config dosyası normalde biz yazılım geliştiricilerin sadece kendi uygulamaları ile ilgili ayarları sakladıkları bir yerdi. Oysa artık IIS içerisinde web uygulamanızın çalıştığı sitenin ayarları ile uygulamanızın ayarlarına aynı gözle bakabiliriz. Bunun bir sonucu olarak aynı site ile ilgili hem programatik ayarlar hem de IIS üzerindeki ayarlar artık Web.Config içerisinde saklanıyor. Gelin Visual Studio 2008 ile yarattığımız yeni bir ASP.NET sitesinin Web.Config dosyasının ufak bir bölümüne göz atalım.

    <!--

        The system.webServer section is required for running ASP.NET AJAX under Internet

        Information Services 7.0.  It is not necessary for previous version of IIS.

    -->

    <system.webServer>

      <validation validateIntegratedModeConfiguration="false"/>

      <modules>

        <remove name="ScriptModule" />

        <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

      </modules>

      <handlers>

        <remove name="WebServiceHandlerFactory-Integrated"/>

        <remove name="ScriptHandlerFactory" />

        <remove name="ScriptHandlerFactoryAppServices" />

        <remove name="ScriptResource" />

        <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"

            type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

        <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode"

            type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

        <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

      </handlers>

    </system.webServer>

Gördüğünüz gibi normalden farklı olarak Web.Config içerisinde system.webServer adında bir tagımız var. Zaten tag ile ilgili gerekli açıklama İngilizce olarak hemen üstündeki yorum satırlarında yapılmış. system.webServer tagları arasındaki ayarlar sadece IIS 7.0 içerisinde geçerli olacak ve burada yapılan ayarlar ile bu uygulamanın çalışacağı IIS içerisinde sitedeki modüller ve HttpHandler'lar düzenlenmiş olacak. Böylece artık IIS 7.0'a bir site yükledikten sonra ayarlarını yapabilmeniz için harici bir web paneli kullanmanız veya sunucuda admin haklarına sahip olmanız gerekmiyor. Doğrudan neredeyse tüm ayarları Web.Config içerisinde düzenleyebiliyoruz.

Bu sistemin bir diğer avantajı ise kendi bilgisayarınızda çalıştığınız IIS üzerinde yaptığınız tüm ayarların otomatik olarak sunucuya Web.Config dosyasının atılması ile karşı tarafa da yansıması. Böylece "Benim bilgisayarımda çalışıyor ve sunucuya atınca çalışmıyor" şikayetlerine son geliyor diyebiliriz. Artık web sitenizi sunucuya yüklediğinizde tüm ayarlarını da karşı tarafa aktarmış oluyorsunuz.

Ufak bir örnek...

IIS içerisinde her web sitesinin otomatik olarak açılmaya ayarlı sayfaları vardır. Genelde bunlar default.htm, default.aspx gibi sayfalardır ve varsayılan ayarlar ile karşımıza çıkarlar. Böylece sunucuya bir site yüklediğinizde ilk olarak hangi sayfanın açılması gerektiği belirtilmiş olur. Eğer bu ayarı IIS 6.0'da değiştirmek isterseniz ya hosting sağlayıcınızın size bir yönetim paneli sunması lazım ya da yine size özel script hakları ayarlaması gerekir. Oysa IIS 7.0 içerisinde bu ayar Web.Config içerisinde saklanıyor. Nasıl mı?

Bilgisayarınızda IIS 7.0 Manager'ı açarak ASP.NET web sitenizi seçin ve IIS Manager içerisinde "Default Document" kısmına giderek yeni bir doküman ismi ekleyin.

IIS 7.0 içerisinde "Default Document" ayarı.
IIS 7.0 içerisinde "Default Document" ayarı.

Bu yaptığınız ayarı kendi bilgisayarınıza yaptınız ve sitenizi sunucuya yüklediğinizde tekrar yapmanız gerekecek! dersem de inanmayın. Çünkü IIS 7.0 içerisindeki bu ayar aslında söz konusu web sitesindeki Web.Config dosyasına yazıldı, aynen aşağıdaki gibi;

  <system.webServer>

        <defaultDocument>

            <files>

                <add value="ornek.aspx" />

            </files>

        </defaultDocument>

  </system.webServer>

Gördüğünüz gibi IIS içerisinde yeni bir "Default Document" eklemek için aslında tek yapmanız gereken Web.Config'de gerekli tanımlamaları yapmak. Bunun gibi daha birçok ayar tamamen Web.Config içerisine hapsedilmiş durumda. Böylece çoğu sorundan kolayca kurtulmak mümkün.

HttpModule yazalım...

IIS 7.0'ın çalışma yapısı ile IIS 6.0'ın yapısı arasında büyük fark var. IIS 6.0'da ISAPI önünde HttpModule yazabilirken IIS 7.0'da aslında çok daha düşük seviyelere inebiliyoruz. Örneğin ASP.NET ile yazdığınız bir HttpModule otomatik olarak sitenizdeki tüm HTML dosyalarını ve PHP sayfaları bile etkileyebiliyor. Bunun nedeni HttpModule'ün doğrudan IIS'in ana motoru üzerinde çalışıyor olması, yani tam bir entegrasyon söz konusu.

Bir HttpModule yazmak için basit bir şekilde yeni bir sınıf oluşturarak iHttpModule interface'ini implemente etmek yeterli olacaktır. Bu işlemi yaptıktan sonra HttpApplication üzerinden bir Request işleminin tüm event'larına ulaşabilirsiniz. Örneğin aşağıdaki gibi bir HttpModule web sayfası içerisinde açılan her sayfanın başına bir metin ekleyecektir.

[VB]

Imports Microsoft.VisualBasic

 

Public Class Class2

    Implements IHttpModule

 

    Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

 

    End Sub

 

    Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init

        Dim myapp = CType(context, HttpApplication)

        AddHandler myapp.BeginRequest, AddressOf myapp_BeginRequest

    End Sub

 

    Private Sub myapp_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)

        Dim myapp = CType(sender, HttpApplication)

        myapp.Context.Response.Write("Deneme")

    End Sub

End Class

[C#]

public class Class1 : IHttpModule

{

    public Class1()

    {

 

    }

 

    public void Dispose()

    {

        throw new NotImplementedException();

    }

 

    public void Init(HttpApplication context)

    {

        HttpApplication myapp = (HttpApplication)context;

        myapp.BeginRequest += new EventHandler(myapp_BeginRequest);

    }

 

    void myapp_BeginRequest(object sender, EventArgs e)

    {

        HttpApplication myapp = (HttpApplication)sender;

        myapp.Context.Response.Write("Deneme");

    }

}

Tabi bu gibi bir HttpModule'ü kullanabilmeniz için Web.Config içerisinde gerekli ayarlamayı da yapmanız gerekir.

  <system.webServer>

    <validation validateIntegratedModeConfiguration="false" />

    <modules>

            <remove name="WindowsAuthentication" />

            <remove name="UrlMappingsModule" />

            <remove name="UrlAuthorization" />

            <remove name="StaticFileModule" />

            <remove name="StaticCompressionModule" />

            <remove name="Session" />

            <remove name="ServiceModel" />

            <remove name="RoleManager" />

            <remove name="RequestMonitorModule" />

            <remove name="RequestFilteringModule" />

            <remove name="ProtocolSupportModule" />

            <remove name="Profile" />

            <remove name="OutputCache" />

            <remove name="IsapiModule" />

            <remove name="IsapiFilterModule" />

            <remove name="HttpLoggingModule" />

            <remove name="HttpCacheModule" />

            <remove name="FormsAuthentication" />

            <remove name="FileAuthorization" />

            <remove name="DirectoryListingModule" />

            <remove name="DefaultDocumentModule" />

            <remove name="DefaultAuthentication" />

            <remove name="CustomErrorModule" />

            <remove name="ConfigurationValidationModule" />

            <remove name="AnonymousIdentification" />

            <remove name="AnonymousAuthenticationModule" />

      <remove name="ScriptModule" />

            <add name="DefaultDocumentModule" />

            <add name="AnonymousAuthenticationModule" />

            <add name="YeniModul" type="Class12 />

    </modules>

  </system.webServer>

Yukarıdaki kod içerisinde IIS 7.0'ın mödüllerini düzenliyoruz. İlk olarak tüm modülleri pasif hale getirerek kullanmayacağımız işlemleri iptal ediyoruz. Sonrasında da sadece üç modül istiyoruz. Bunlardan DefaultDocumentModule otomatik olarak varsayılan dokümanın açılmasını sağlıyor. AnonymousAuthenticationModule ise anonim ulaşımı sağlıyor. Sonrasında da bizim yazdığımız HttpModule'ün sınıf ismini taşıyan yeni modülümüzü ekliyoruz. Böylece artık bu web sitesi içerisindeki tüm isteklerde bu modül de çalışacak.

İsterseniz tüm bu modül ayarlarını otomatik olarak IIS Manager içerisinde de yapabilirsiniz. Ayarlamaları yapacağınız web sitesini seçtikten sonra "Modules" kısmına geçerek tüm modülleri silebilir, sağ menüden "Add Managed Module" diyerek site içerisinde yazılmış modülleri bularak ekleyebilirsiniz.

Başka neler var?

IIS 7.0 içerisinde FastCGI ile PHP desteği geliyor. Hatta PHP tarafında da yukarıdaki HttpModule'lerin çalıştığını düşünürseniz PHP ile tüm bu modülleri kullanabileceğiniz sonucuna varabilirsiniz. Örneğin ASP.NET Forms Authentication modülünü PHP ile kullanabilirsiniz hatta böylece yarısı PHP yarısı ASP.NET ile yazılmış bir sitede global Authentication sistemi bile kurmuş olursunuz. Daha bu gibi bir çok esnekliğe sahip olan IIS 7.0 ile yazılım geliştirme ortamı arıyorsanız Vista ile beraber IIS 7.0'ın geldiğini de hatırlatmak isterim.

Hepinize kolay gelsin.

Daron Yöndem
MVP, MCT, MCPD, MCITP, MCTS
MCSD, MCAD, MCDBA, MCP, ACP, ICSD
Blog: http://daron.yondem.com
Sorularınız için: http://daron.yondem.com/tr/sorusor