IIS 7.0 ve ASP.NET yenilikleri.

0 dakikada yazıldı

12981 defa okundu

Düzenle

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.