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ı.
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.