| « turnaround time | Office 2010 elektronik imza yeniliği » |
asp.net ve web platformu ile ilgili tavsiyeler.
Bu aralar bende yeni bir projeye başladığım için geçmiş tecrübeleri bir köşeye yazmanın zamanı geldi diye düşünüyorum. Umarım bir gün faydasını görürsünüz.
Henüz hiç kod yazmadıysanız öncelikle geliştirdiğiniz uygulamayı kimlerin kullanacağı konusunda biraz düşünmeniz gerekiyor. Intranet (ofisiniz diyelim) içinde çalışacak bir uygulama ile internet üzerinden kullanılacak uygulama arasındaki uçurumların daha sonra farkına varabilirsiniz.
Bant Genişliği
Eğer intranet içerisinde ve sınırları aşmayacak kullanıcı adedinde olacak ise biraz daha rahat davranabilir bant genişliğini düşünmeden hızlı kod geliştirmeye odaklanabilirsiniz. Bu durumda ASP.NET kontrolleri yada MVC ile yol almakta fayda var. Bunlarla çok basit uygulamaları neredeyse hiç kod yazmadan arayüzlerle geliştirmeniz bile olası.
View State
Yeterli bant genişliği olsa bile IDE'den New Project dediğiniz anda web.config'den viewstate'i çok mecbur kalmadığınız sürece bir daha açmamak üzere kapatmanız iyi olacaktır.
Eğer kendiniz web controlleri geliştirecekseniz mecbur kaldığınızda control state'i kullanmaya çalışın. Yeniden hesaplayabildiğiniz şeyleri (DropDrown'ın listesi gibi) viewstate yerine veritabanı gibi ortamlardan oluşturun. Ancak hesaplayamadığınız (DropDown'ın seçili item'ı gibi) değerleri sadece control state'e yazın. Bu tercih ilerde sizi 60kb'lik html sayfasına karşılık 700kb'lik viewstate'den kurtaracak, hem network hemde cpu anlamında rahat etmenizi sağlar.
Login
Daha sonra uygulamanın kullanıcılarının sisteme nasıl giriş (login) yapacakları konusunda düşünmeniz gerekiyor.
Eğer tüm kullanıcıların AD (Active Directory) içerisinde hesabı var ise sizden şifre girilmeyen bir uygulama isteyeceklerdir. Bu yüzden Windows Authentication kullanmalısınız. Bu arada windows authentication sadece Internet Explorer ile çalışır, Firefox veya Chrome kullanmakta ısrar eden patronlarınız var ise şifre girmek zorunda kalacakları konusunda uyarmanız uyarmanız yerindedir.
Etrafta yeterince bilgi olduğu için Forms Authentication'ın detaylarına girmiyorum.
Uygulamanın giriş yapılmadan kullanılacak bölümleri (örneğin ana sayfa gibi) olacak ise giriş yapılacak bölümün dosyalarını ayrı bir dizin içerisinde tutun ve bu dizinde aşağıdaki gibi bir web.config dosyası tanımlayın. Böylece henüz login olmamış kullanıcılar bu dizin içerisindeki bir sayfaya erişmek istediğinde login sayfasına yönlendirilecektir.
XML:
<configuration> | |
<system.web> | |
<authorization> | |
<deny users="?"/> | |
</authorization> | |
</system.web> | |
</configuration> |
Dil problemleri
Türkçe ve diğer tüm dil problemlerinden kurtulmak için web.config aşağıdaki şekilde olmalı;
Code:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" enableClientBasedCulture="true" culture="auto" uiCulture="auto" /> |
Şu anda hiç planınızda olmasa bile lokalizasyon için kullanılan resource dosyalarının kullanımını öğrenin.
Session
Eğer session içerisinde bir şey tutmamayı planlıyorsanız (-ki bu doğru yoldasınız demek) sessionState'i kapatarak biraz daha performans kazanabilirsiniz. Eğer aynı anda 100+ kullanıcıyı geçecek bir sistem geliştiriyorsanız, session kullanmanızı kesinlikle tavsiye etmem.
Hazır session hakkında konu açılmışken, eğer uygulamanız birden fazla sunucuda paralel olarak çalışacak (Load balanced yada Cluster diye geçer) ise mümkün olduğu kadar session kullanmaktan kaçının. Mecbur kalmanız durumunda session içerisine koyduğunuz nesnelerin serialize edilebilir olmasına dikkat edin.
Load balancing
Normalde session bilgileri web sunucusunun hafızasında saklanır. Yani siz sunucuyu kapattığınızda bu bilgiler kaybolur. Özel durumlar haricinde yük paylaşımı yapılan sunucularda session bilgileri sunucunun hafızası yerine serialize edilerek veritabanı üzerinde saklanır. Böylece 1. tıklamada A sunucusuna giden istek, 2. tıklamada B sunucusuna gittiğinde uygulama kaldığı yerden devam edebilir. Eğer bu konu size çok problem yaratıyor ise network sorumlunuz ile konuşarak bağlantı açan istemcinin hep aynı sunucu üzerinde kalmasını sağlayabilirsiniz. (Umarım karmaşık olmadı)
HTML
Boşluk karakterleri
HTML ile ilgili yapacağınız en iyi ve kısa optimizasyon ne kadar cici ve anlaşılabilir gelirse gelsin Visual Studio'nun aspx dosyaları üzerindeki salak indent'lerini kaldırmak olacaktır.
Nedeni ise çok fazla detay ve ascx tipi kontroller içeren sayfalar verilen indentler nedeniyle sunucunuzdan çıkacak olan " " (boşluk) karakterleri normal html boyutunu geçebilir.
Özellikle bu konuya liste tipi ekranlarda dikkat etmeniz gerekli. Örneğin listenin her satırında aşağıdaki gibi bir kodun tekrar ettiğini varsayalım.
Code:
<asp:Panel runat="server"> | |
<asp:Button runat="server" Text="tıkla"/> | |
<asp:Button runat="server" Text="hey"/> | |
</asp:Panel> |
Bu durumda browser'a 20 adet boşluk ve 4 tane yeni satır karakteri göndermiş oluyorsunuz. Toplamda bu 28 byte civarı bir şey yapar. Eğer listede 1000 adet kayıt listelenirse hiç kimsenin işine yaramayan 28kb'lik boş veri gönderiyor olursunuz. (Html boyutu dışında bunun sunucunuzda farklı etkileride var ama detayı sonra anlatırım)
Hyperlinkler
Bu bölüm çok önemli değil ama benim gibi titiz karakterli olanlar sevebilir.
Sayfalar içerisinde verdiğiniz linklerin anlaşılabilir olmasına aslında gerek yok. Örnekle gideyim;
bir arama kutunuz var diyelim;
Code:
<form action="executesearch.aspx"> | |
<input type="textbox" name="aranacakkelime"/><input type="button" name="b"/> | |
</form> |
Bu şekilde bir html yerine aşağıdaki gibi daha kısa kelimeleri seçebilirsiniz.
Code:
<form action="es.aspx"> | |
<input type="textbox" name="k"/><input type="button" name="b"/> | |
</form> |
Böylece sunucu ve browser arasında gidip gelen veri miktarını azaltabilirsiniz. Bu mantık arama kutusu için ben anlamlı gelmeyebilir ama örneğin arama sonuçları sayfasında verdiğiniz linklerde
Code:
<a href="details.aspx?sayfano=5">Detay</a> |
yerine;
Code:
<a href="d.aspx?i=5">Detay</a> |
hatta biraz biliyorsanız rewrite rule'lar ile;
Code:
<a href="d/5">Detay</a> |
verdiğinizde her satır için ilk örnekte 10, ikincide 19 byte kazanırsınız. Bu fazla gözükmeyebilir ama 1000 satır kayıt listelediğinizde 19kb kazanıyorsunuz demektir.
Resim linkleri
Bunu çok fazla kişi bilmez ancak neredeyse tüm browserlar gezinti yaparken sayfanın içeriğini sunucudan indirmek için site başına 2 ağ bağlantısı kullanır. Bu kullanıcı bir link'e tıkladığı zaman 1. kanaldan html içeriği indirilirken 2. kanaldan css,javascript,resim gibi diğer bilgiler indirilir. Örneğin 5 tane css dosyası kullanıyorsanız bu durumda neredeyse hepsi sıralı olarak sunucudan indirilir.
Bu tür bir problemi gidermek için farklı içerikleri aslında aynı siteyi gösteren ancak farklı isimlerle göstererek browser'ı kandırabilirsiniz. Yani css ve js dosyaları için farklı bir adres, resimler için farklı bir adres verebilirsiniz. Örneğin;
Code:
<html> | |
<head> | |
<link href="http://res.benimguzelsitem.com/css/elma.css" rel="stylesheet" type="text/css" /> | |
<link href="http://res.benimguzelsitem.com/css/armut.css" rel="stylesheet" type="text/css" /> | |
</head> | |
<body> | |
<img src="http://img.benimguzelsitem.com/img/jennajameson.jpg"/> | |
<img src="http://img.benimguzelsitem.com/img/emilyscott.jpg"/> | |
</bod> | |
</html> |
Şimdi bu yapıya göre "res.benimguzelsitem.com" ve "img.benimguzelsitem.com" web siteleri aslında "www.benimguzelsitem.com" ile aynı IP adresini kullanmakta (DNS tanımları üzerinden bunu yapabilirsiniz) ve hatta IIS üzerinde aynı dizini göstermekte.
Böylece browser'ı kandırarak normalde 2 yerine 6 kanaldan sayfa içeriğini indirmenizi sağlar, buda hızlı açılan sayfalar demek.
Şimdilik bu kadar.