Hayatımdaki Değişiklikler ve MVP'likten Ayrılışım

Son 1 yıl içerisinde değişik heyecanlar ve farklı duygular yaşadığım için 2011 yılının bende çok önemli bir yeri bulunmakta. İnsan bir zamana kadar kendisi için yaşar, sonra ailesi ve çocuğu(çocukları) için yaşamaya başlar derler. 20 Kasım 2011 tarihinde Allah'a şükürler olsun ki bir kız çocuğum dünyaya geldi ve tahmin edeceğiniz gibi bambaşka bir hayata gözlerimizi açtık beraberce. Bu güzel duygu tabii ki beraberinde sorumluluklar ve uykusuz geceleri de beraberinde getirdi.

Çalıştığım kurumda da oldukça yoğun bir dönem geçirdim ve daha da yoğun dönemlerin arefesindeyim. Bu yorucu ve yoğun süreçlerin içerisindeyken önemli bir karar almam gerekiyordu. 10 gün kadar önce Microsoft MVP Program Lead'ımız Sinem Eylem Arslan'a da danışarak iznimi aldım ve bu yıl aday gösterilmeyerek Microsoft MVP ünvanımı Nisan ayı itibariyle bırakmaya karar verdim. Bu kararı vermemdeki en önemli etken yukarıda bahsettiğim nedenlerden dolayı artık eskisi kadar üretken olamamam ve yaptığım gönüllü çalışmalarla bu ünvanı artık haketmediğimi düşünmemdir.

Bundan sonra gönüllü çalışmalarım devam edecek mi diye sorabilirsiniz. Tabii ki devam edecek, bırakmam söz konusu olamaz çünkü paylaşmayı, insanların benim yazdıklarımla anlattıklarımla birşeyler öğreniyor olması benim için büyük mutluluk. Eskisi kadar aktif olamasam da boş zamanlarımda yazılar yazmaya, seminer ve webiner gibi etkinliklerde bulunmaya devam edeceğim. Hergün birçok kişiden gelen mailleri yine elimden geldiğince hızlı şekilde cevaplamaya devam edeceğim. Zaten sitenin sağ kısmında bulunan MVP logosu 1 Nisan 2012 tarihine kadar orada yer alacak ve ben o tarihe kadar görevimi iyi şekilde yapmaya çalışacağım.

Son olarak 3 yıldır bana bu ünvanı layık gören Microsoft'a ve üzerimde emeği olan herkese sonsuz teşekkürlerimi iletiyorum.

5 Ocak 2012 Perşembe 21:52

Yorum - RSSYorumlar (4)

Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Nedirtv - Ocak Ayı Webinerleri

Nedirtv webinerleri tam gaz devam ediyor. Ocak ayında 6 farklı konuşmacıdan 6 farklı webinerimiz olacak.

Konuşmacılardan biri de benim. Bu kez farklı bir konu ve farklı tarzda bir sunum yapmaya çalışacağım. Mobil programlamaya uzak bir ASP.NET programcısı(ve IPhone kullanıcısı) olarak kısa süreli Windows Phone 7.5 maceramda edindiğim deneyimleri anlatmaya çalışacağım. Sunum Level 100 olacak, öyle ASP.NET vb. konulardaki sunumlarım gibi Level 200-300 tadında detaylar beklemeyin şimdiden söyleyeyim:) Katılmak isteyen arkadaşları beklerim. Ocak ayındaki tüm webinerlerin bilgileri aşağıda görünmektedir.

- Facebook etkinliğine kaydolmak ve webinerlerden haberdar olmak için etkinliğimize "Katılıyorum" bu sayfadan diyebilirsiniz.
- Webinerleri Outlook ajandanıza kaydetmek için en kısa sürede www.nedirtv.com adresinde webiner linkleri oluşturulacaktır.

Konu: ASP.NET Programcısının Windows Phone 7.5 Macerası
Tarih: 7 Ocak 2011 Cumartesi 21:00
Konuşmacı: Uğur UMUTLUOĞLU
Link: https://www.livemeeting.com/cc/mvp/join?id=HD342B&role=attend

Konu: SharePoint 2010 Yetkilendirme Teknikleri
Tarih: 9 Ocak 2011 Pazartesi 21:00
Konuşmacı: Burak BATUR
Link: https://www.livemeeting.com/cc/mvp/join?id=99T4D2&role=attend

Konu: Roslyn: Derleyicinin Yeniden Keşfi
Tarih: 13 Ocak 2012 Cuma 21:00
Konuşmacı: Fatih BOY
Link: https://www.livemeeting.com/cc/mvp/join?id=2H9C27&role=attend

Konu: Entity Framework - Code First Development
Tarih: 23 Ocak 2011 Pazartesi 21:00
Konuşmacı: Burak Selim ŞENYURT
Link: https://www.livemeeting.com/cc/mvp/join?id=Q647HF&role=attend

Konu: HTML 5
Tarih: 25 Ocak 2011 Çarşamba 21:00
Konuşmacı: Cemil UZUN
Link: https://www.livemeeting.com/cc/mvp/join?id=4H5SDN&role=attend

Konu: Silverlight 5 ile Gelen Yenilikler
Tarih: 30 Ocak 2011 Pazartesi 21:00
Konuşmacı: Görkem SEZGİN
Link: https://www.livemeeting.com/cc/mvp/join?id=3BHK2Z&role=attend

2 Ocak 2012 Pazartesi 15:21

Yorum - RSSYorumlar (1)

Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Debug ve Release Modlarda Farklı Kod Çalıştırma

Uygulama geliştirme sürecinde canlı ortamda çalışması gereken bazı kodların test amaçlı olarak local ortamlarda değiştirilmesi, denenmesi gerekebiliyor. Bu durum uygun teknikler kullanmazsa kod tarafında değişiklikler yapılmasını, dolayısıyla çalışan kodun değiştirilmesini gerektirebiliyor. Gözden kaçması durumunda test amaçlı yazılan bir kodun canlı ortama atılması ve çalıştırılmasının ne gibi sonuçlar doğurabileceğini anlatmaya gerek yok sanırım! Bu yazımda .NET uygulamalarında ve bilhassa ASP.NET uygulamalarında bir kod veya kod bloğunun debug ve release modlarda farklı çalıştırılmasını sağlayan 3 farklı tekniği biraz detayına girerek incelemeye çalışacağız.

Önce örnek senaryo üzerinden sorunu inceleyelim. Projemizde bir web servisine bağlanıyoruz, ancak bu servis bilhassa local ve test ortamlarımızda çok yavaş çalışıyor, bu da geliştirme sürecimizi yavaşlatıyor. Servis GetProduct isimli bir metottan bize ID=58, Name="Kalem", Price=3,9 ... gibi bilgileri içeren bir Product nesnesi döndürüyor. Sonuçta test ortamında çalıştığımız için içi dolu bir Product nesnesi sayfamızın çalışması ve UI testlerimizin yapılmasına yeterli olacaktır. F5 tuşuna basıp sayfayı görmek istediğimiz her durumda 15-20 saniye beklemek hem bizi yavaşlatır, hem de developer olarak kod yazma şevkimizi azaltır değil mi? Web servisinden onlarca metot çağırdığımızı ve her işlem için gereksiz yere beklediğimizi düşünürsek zaman kaybının bizim için ne kadar önemli boyutlara ulaştığını daha iyi anlarız. O zaman şöyle bir yol bulabilsek;

Product p = null;
if (mode == "release")
{
    MyWebService proxy = new MyWebService();
    p = proxy.GetProduct(id);
}
else
{
    p = GetDummyProduct(id);
}

Süper bir çözüm olmayabilir, ama sorunumuzu ortadan kaldırdığı kesin. Bu ve buna benzer örnekleri çoğaltmamız mümkün. Peki .NET uygulamalarında bu tip bir sorunu en sağlıklı şekilde nasıl çözebiliriz?

Çözüm-1: #if DEBUG Önişlemci Direktifi

Kullanım şekli:

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        #if DEBUG
            Response.Write("Debug modda calisiyorum");
        #else
            Response.Write("Release modda calisiyorum");
        #endif
    }
}

#if DEBUG ifadesi ile #endif arasında kalan satırlar C#(veya VB.NET) derleyicisi tarafından proje eğer debug modda ise IL(Intermediate Language) kodları içerisine alınır, release modda ise alınmaz. Eğer bu ifade yukarıdaki gibi #else ile kullanılırsa, proje release modde iken IL kodlarına sadece else kısmındaki kodlar alınır. Yukarıdaki kodu debug modda derleyip, daha sonra oluşan dll dosyasını .NET Reflector veya ILSpy gibi bir programda açarak IL içerisinde tutulan kodları gözlemlediğimizde Page_Load metodunda sadece debug mode için yazılan kodu görürüz.

Resim: #if DEBUG direktifli kodu debug modda derlediğimizde IL içerisine alınan kodlar

 

Çözüm-2: System.Diagnostics.Conditional Attribute Nesnesi

Kullanım şekli:

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DebugMetodu();
    }
    [Conditional("DEBUG")]
    protected void DebugMetodu()
    {
        Response.Write("Debug modda calisan metot");
    }
}

Sadece debug modda çalışması istenilen bir kod bloğumuz varsa ve bu kod bloğunu metot olarak yazmak istersek Conditional attribute nesnesini kullanabiliriz. Kod debug modda derlendiğinde DebugMetodu() isimli metot assembly içerisinde kalacaktır, ancak Page_Load'daki metot çağırımı koddan çıkarılacaktır.  Yukarıdaki kodu önce debug modda, sonra release modda derlediğimde ILSpy'da sırasıyla aşağıdaki görüntüleri elde ediyorum. Release modda Page_Load'da herhangi bir metot çağırımının yapılmadığı görülüyor.


Resim: Debug modda elde edilen kod


Resim: Release modda elde edilen kod(Page_Load'da metot çağırımı yok)

 

Çözüm-3: HttpContext.Current.IsDebuggingEnabled Özelliği

Kullanımı:

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (HttpContext.Current.IsDebuggingEnabled)
            Response.Write("web.config'de debugging acik");
        else
            Response.Write("web.config'de debugging kapali");
    }
}

HttpContext.Current.IsDebuggingEnabled özelliğini Http context'den de anlayacağımız üzere sadece web uygulamalarında kullanabiliyoruz. #if DEBUG ve Conditional attribute kullanımlarından farklı olarak IsDebuggingEnabled özelliği derleyici tarafından ele alınmayan ve kod olarak her zaman IL içerisinde yer alacak bir kullanım şeklidir. Bu özellik web uygulamasının web.config dosyasında yer alan system.web > compilation elementindeki debug niteliğinin değerine göre kod akışının belirlenmesini sağlar. Eğer debug niteliği true ise IsDebuggingEnabled özelliği true değerini getirir ve yukarıdaki kod örneğinde if bloğu çalıştırılır. web.config elementleri dll çıktıları alındıktan sonra da değiştirilebildiği için yukarıda incelediğimiz ilk iki kullanımdan farklı olarak çıktısı alınan uygulamada web.config'de yapılacak değişikliğe göre kod akışını değiştirebilme özelliğine sahiptir.

web.config'de debug özelliğini açık bırakmak için;

<configuration>
	<system.web>
		<compilation debug="true" targetFramework="4.0"/>
	</system.web>
</configuration>

şeklinde bir ifade yer almalıdır. Ancak web uygulamasının performansını etkileyeceği için zorunlu kalmadıkça bu özelliğin değerini false olarak belirlemeliyiz.

Yukarıdaki kodu derleyip oluşturulan dll dosyasının içeriğini incelediğimizde yazdığımız kodların aynen muhafaza edildiğini görebiliriz.


Resim: IsDebuggingEnabled özelliği ile ilgili yazılan kodlar aynen IL içerisinde saklanır

Bu şekilde uygulamanın debug ve release modlarda derlenmesi durumunda istenilen modda istenilen kodun çalıştırılmasını üç farklı yolla nasıl gerçekleştirebileceğimizi gördük. İncelediğimiz ilk iki yol tüm .NET uygulamarında, üçüncü yol ise sadece web uygulamalarında kullanılabilen bir yöntemdir.

23 Aralık 2011 Cuma 00:07

Yorum - RSSYorumlar (0)

Etiket: , ,
Kategori: .NET Framework | ASP.NET | C#

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Kadir Has Üniversitesi ASP.NET ve ADO.NET Workshop'ı Ardından

Geçtiğimiz hafta sonu(10-11 Aralık) Kadir Has Üniversitesi IEEE Öğrenci Kolu'nun davetlisi olarak Cibali Kampüsü'ndeydim. 2 gün süren etkinlikte ASP.NET ve ADO.NET ile Veri Uygulamaları Geliştirmek konusunda laboratuvar ortamında bol uygulamalı çalışmalar yaptık. Session-Cookie kullanımı, ADO.NET mimarisi ve nesneleri, veri kontrollerinin kullanımı, ASP.NET Membership ile Role Provider'larının kullanımı ve Ajax ile ilgili örnekler yaptık. İlk gün 25 kişi olan katılım sayımız pazar gününün cazibesi nedeniyle ikinci gün biraz düşse de, gerçekten çok keyifli ve faydalı bir etkinliği geride bıraktık. Ağırlıklı olarak üniversite öğrencilerinin katıldığı workshop'ta Adana'dan dahi bir katılımcının gelmesi benim için biraz ilginç oldu.

Bahar döneminde C# ile Nesne Tabanlı Programlama konusunda benzeri bir workhop'ı Kadir Has Üniversitesi'nde gerçekleştirmek üzere öğrencilere söz vermiş bulundum, aksilik olmaz ve etkinliği yaparsak yine twitter ve facebook hesaplarımdan duyurularını yapacağım(takibe devam). IEEE Öğrenci Kolu'ndan Neslihan Mutlu'ya vermiş olduğu desteklerden dolayı canı gönülden teşekkür ediyorum.

14 Aralık 2011 Çarşamba 13:05

Yorum - RSSYorumlar (1)

Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Session Süresi Azaldığında Uyarı Penceresi Çıkarma ve Session Uzatma

Bir önceki blog yazımda ASP.NET uygulamalarında sessionless bir sayfanın nasıl üretilebileceği konusuna değinmiştim. O yazının içerisinde de esrarengiz bir not ile ilerleyen günlerde sessionless sayfa kullanımına güzel bir örnek vereceğimiz belirtmiştim. İşte; şu an o yazıyı okuyorsunuz.

Günümüzde web uygulamalarını daha kullanışlı hale getirmek için bir çok araç kullanmakta ve kullanıcı memnuniyetini arttıracak özellikleri uygulamamıza katmanın yollarını aramaktayız. Son yıllarda benim dikkatimi çeken özelliklerden birisi de bir web sitesinde oturum açtıktan sonra, eğer oturum zamanı bitmeye yaklaşırsa açılan bir popup pencerede "İşlem yapmazsanız az sonra oturumunuz kapatılacaktır. Oturumunuzu devam ettirmek istiyor musunuz?" şeklindeki mesajlardır. Bu tip pencerelerle özellikle bankacılık uygulamalarında karşılaşabiliyoruz. Ben kendi literatürümde bu pencerelere "oturum uzatma pencereleri" adını verdim. Bu yazıda bir ASP.NET uygulamasında oturumun biteceğini istemci tarafında nasıl yakalayacağımızı ve sunucu tarafında yapacağımız işlemlerle bu süreci nasıl uzatacağımıza, yani oturum uzatma pencerelerini nasıl kullanacağımıza bakacağız.

İlk olarak sorunun kaynağını görelim ki, az sonra göreceğimiz dolambaçlı yolu neden kullanmak zorunda olduğumuzu iyice anlayabilelim. Session timeout değerinin 20 dakika olduğunu baz olarak şöyle bir senaryo üzerinde konuşalım:

- Kullanıcı oturum açar ve işlemler yapar.
- Kullanıcı 19 dakika boyunca sitede hiçbir işlem yapmaz.
- Oturumun bitmesine 1 dakika kala kullanıcıya uyarı penceresi açar ve deriz ki: "Oturumu devam ettirmek istiyorsan aşağıdaki butona tıkla".
- Kullanıcı butona tıklarsa oturumu 20 dakika daha uzatılır, bir işlem yapmazsa oturumu sonlandırılır.

Adımlar oldukça anlaşılır ve son derece basit gibi görünüyor. Ancak burada iki kritik nokta var; birincisi 19 dakika boyunca işlem yapmayan bir kullanıcıdan nasıl haberdar olacağız ve onu nasıl uyaracağız. Zira HTTP sadece istek-cevap mekanizması üzerinde çalışır ve kullanıcıdan istek gelmeden biz sunucudan A isimli kullanıcıya hiçbir çağrı yapamayız. Tahmin edeceğiniz üzere bu sorunu istemci tarafında çözeceğiz, yani JavaScript kullanacağız. İkinci sorunumuz ise bir önceki yazımı okuyan arkadaşların tahmin edebileceği sorundur. 19 dakika geçtikten sonra istemci tarafında uygulamamıza ait bir sayfa açarsak zaten session otomatik olarak uzatılacaktır. Yani kullanıcı butona dahi tıklamadan, kullanıcı onay vermeden biz oturumunu uzatırız. İşte bu sorunu aşmak için de istemci tarafında popup pencerede açılan sayfanın kullanıcıya ait oturumu etkilememesi gerekmektedir.

"Ayrı bir popup penceresi açmadan, aynı pencere içerisinde bir modalpopup açarak uyarı verirsek tekrar sunucuya gitmeyeceğimiz için böyle bir sorunla uğraşmayız" durumu aklınıza gelebilir. Evet doğrudur, modalpopup kullanarak böyle karışık bir yola girmeden de kullanıcıya uyarı verilebilir, ancak ben bu yöntemin çok kullanışlı olduğunu düşünmüyorum. Zira aynı pencere içerisinde açılacak bir modalpopup kullanıcının aktif penceresinde doğrudan görünmeyeceği için kullanıcının bu pencereden haberi dahi olmayabilir. O nedenle benim burada anlattığım örneğin çok daha kullanışlı olacağından eminim, zira kullanıcının ekranına fırlayan bir popup penceremiz olacak!

Oluşturacağımız projeyi local makinamızda düzgün şekilde test edebilmemiz için uygulamayı IIS üzerinde host etmemiz gerekmektedir. Zira oluşturacağımız uyarı sayfasının varolan oturum nesnesine erişmesini engellemek için ayrı bir alt uygulamaya ihtiyaç duymaktayız. Tavsiyem; öncelikli olarak dizin tanımlamalarını yapıp IIS'de projeyi tanımlanamız, sonrasında da Visual Studio'da projeyi Open Web Site menüsünden açmanız şeklinde olacak.

NOT: Eğer varolan bir proje üzerinde çalışıyorsanız, ve bu projeye local dizinden erişiyorsanız projeye IIS üzerinden devam etmek için;
- Web Site şablonuyla açılan bir projeyi kapatıp, IIS'de dizinleri belirterek tanımlamanız, daha sonra da Open Web Site menüsünde açılan pencerede sağ kısımdan Local IIS'i seçmeniz ve uygulama dizinini seçmelisiniz.
- Web Application şablonunu kullanıyorsanız, Solution Explorer'da proje üzerine sağ tıklayıp Properties > Web sekmesinden Servers bölümündeki Use Local IIS Web server seçeneğini seçmeniz gerekmektedir(Belirtilen dizin IIS'de yer almıyorsa Create Virtual Directory butonuna tıklamayı unutmayın)

Nihayetinde bu işlemleri tamamladığınızda IIS ve Solution Explorer'da aşağıdakine benzer bir dosya yapınız olmalıdır.

IIS'de oluşturulan projeyi Visual Studio'da açtığınızda subsite dizininin içeriği getirilmeyecektir. Bu sorunu gidermek için resimde anlattığım gibi işlemleri gerçekleştirirseniz en alttaki kutu içerisinde görüleceği üzere Solution Explorer'da ayrı bir proje gibi yer alacaktır.

Sayfaları hızlı şekilde test edebilmek için öncelikli olarak session timeout değerini azaltıyoruz. Ana dizindeki web.config dosyasında sessionState elementine ait timeout değerini "1" yapıyorum(normal uygulamalarda bu değer "20" olmakta).

web.config
<system.web>
  <compilation debug="true" targetFramework="4.0"/>
  <sessionState timeout="1"/>
</system.web>

Default.aspx isimli bir sayfada oturum açmamızı sağlayan ve o an oturumun açık olup olmadığını kontrol eden iki adet butonumuz var. Bu sayfa arka planda oturumun bitmesine ne kadar süre kaldığını hesaplayacak ve az bir zaman kaldığında da popup pencerede kullanıcıya uyarı sayfasını gösterecektir. Bu işlemleri istemci tarafında yapabilmek için bir JavaScript fonksiyonu oluşturmamız ve fonksiyon içerisinde timer kullanarak oturumun bitmesine ne kadar süre kaldığını hesaplamamız gerekiyor. JavaScript'te setTimeout metodu timer işlevini görmektedir. setTimeout(functionName,interval) yapısındaki fonksiyonun 2. parametresi tetiklenmenin kaç saniyede bir yapılacağını, 1. parametre ise her tetiklenmede hangi fonksiyonun çağrılacağını belirler. clearTimeout metodu ise açık olan bir timer'ın kapatılmasını sağlar. Sayfamızın kodları aşağıdaki gibi:

Default.aspx
<body id="bodyElement" runat="server">
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
            Text="Oturum Aç" />
        &nbsp;<asp:Button ID="Button2" runat="server" onclick="Button2_Click" 
            Text="Oturumu Kontrol Et" Width="159px" />
        <br /><br />
        <asp:Label ID="lblMessage" runat="server"></asp:Label>
    </div>
    </form>
    <script type="text/javascript">
        var popupTime = (<%=Session.Timeout %> * 60000) - 20000; //20 saniye kala uyarı penceresi açacağız
        function countTime() {
            var timer = setTimeout("countTime()", 1000);
            if (popupTime > 0) {
                popupTime -= 1000;
            }
            else {
                clearTimeout(timer);
                window.open('subsite/OturumKapamaUyari.aspx''window1''width=350,height=250,scrollbars=yes');
            }
        }
    </script>
</body>
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        string username = "dummyuser";
        Session["username"] = username;
        lblMessage.Text = "Oturum açıldı. Merhaba " + username + "<br/>Timeout süresi: " + Session.Timeout;
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        if (Session["username"] == null)
            lblMessage.Text = "Oturum kapanmış";
        else
            lblMessage.Text = "Oturum açık. " + Session["username"];
    }
    protected void Page_PreRender(object sender, EventArgs e)
    {
        if (Session["username"] != null// Authentication kullanilirsa if(User.Identity.IsAuthenticated)
            bodyElement.Attributes.Add("onload""countTime();");
    }
}

Sayfanın ilk yüklenişinde sunucudan elde ettiğimiz Session.Timeout değeri ile istemci tarafında ne zaman popup pencereyi çıkacağımızı belirliyoruz. countTime isimli JavaScript fonksiyonu sayfanın PreRender olayında eğer oturum açılmışsa <body> elementinin onload olayına eklenmektedir. Dolayısıyla oturum açıldıktan sonra sayfa yüklendiğinde session süresi işlemeye başlıyor, bizim de JavaScript timer'ımız işlemeye başlayarak zamanı geldiğinde pencereyi açıyor. Butonlarımızdan ilkinin click olayında basit bir oturum açıyor, ikinci butonun click olayında ise sadece o an oturum açılmış mı diye kontrol ediyoruz.

countTime fonksiyonunun içerisinde görüleceği gibi subsite dizininin altında OturumKapamaUyari.aspx isimli bir dosyamıza link vermişiz. Bu dosya uygulamanın alt dizininde yer alıyor, ancak daha önceden de anlattığımız gibi bu dizin IIS'de ayrı bir dizin olarak tanımlandığı için dosya farklı şekilde davranmakta ve ana uygulamanın Session nesnesine erişmemektedir.

subsite dizini altındaki web.config ve OturumKapamaUyari.aspx dosyalarının kodları aşağıdaki gibidir.

subsite/web.config
<system.web>
  <compilation debug="true" targetFramework="4.0"/>
  <sessionState cookieName="subsite"></sessionState>
</system.web>
subsite/OturumKapamaUyari.aspx
<body style="background-color: #336699; color: White;">
    <form id="form1" runat="server">
    <div style="font-family: Segoe UI Semibold; font-size: 18px;">
        Açık olan oturumunuz kapatılacaktır.
        <br />
        Kalan süre: <strong><span id="remainingTime">20</span> saniye</strong>
        <br />
        <br />
        <asp:Button ID="btnContinue" runat="server" Text="Oturumun Devam Etmesi İçin Tıklayın"
            Width="266px" OnClick="btnContinue_Click" />
        <br />
        <span id="endSession" style="visibility: hidden">Oturum zaman aşımına uğradı ve sonlandırıldı</span>
    </div>
    </form>
</body>
<script type="text/javascript">
    showTime();
    function showTime() {
        var value = document.getElementById('remainingTime').innerHTML;
        var timeoutParam = setTimeout("showTime()", 1000);
        if (value > 0) {
            document.getElementById('remainingTime').innerHTML = value - 1;
        }
        else {
            document.getElementById('btnContinue').style.visibility = 'hidden';
            document.getElementById('endSession').style.visibility = 'visible';
            clearTimeout(timeoutParam);
        }
    }
    function closeWindow() {
        window.close();
        return false;
    }
    function countTime() {
        var timer = setTimeout('showTime()', 1000);
    }
</script>
subsite/OturumKapamaUyari.aspx.cs
public partial class OturumKapamaUyari : System.Web.UI.Page
{
    protected void btnContinue_Click(object sender, EventArgs e)
    {
        Response.Redirect("../OturumDevam.aspx");
    }
}

OturumKapamaUyari.aspx sayfasında görsellik açısından süreyi geriye doğru sayan bir kontrol eklemiş olsam sayfanın kodlarını biraz karmaşık gibi gösteriyor, ancak bu şekliyle sayfa daha kullanışlı olmuştur diye düşünüyorum. Aynı zamanda sayfa geriye kaç saniye sayacağını da bu kontrolün içerisindeki metin değerinden anlamaktadır(). Burada asıl önemli olan kullanıcının bu pencereden oturumun kapanacağını öğrenmesi ve bunu engellemesi için btnContinue isimli butona tıklayarak ana uygulamadaki bir sayfayı çağırmasıdır. Böylece oturum nesnesi ötelenecek, bir başka deyişle uzatılacaktır. Uygulamanın ana dizinine OturumDevam.aspx dosyası ekliyoruz. Bu sayfa teknik olarak sunucu tarafında oturumu uzatmak dışında bir işlem yapmayacağı için talep gördükten hemen sonra sayfayı JavaScript ile kapatmamız mantıklı olacaktır. Bunun için de sayfanın HTML kodlarının aşağıdaki gibi olması yeterlidir.

OturumDevam.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script language="javascript">
        onLoad();
        function onLoad() {
            window.close();
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

Uygulamamız hazır. Timeout değerimiz 1 dakika olduğu için Default.aspx sayfasını açıp Oturum Aç butonuna tıkladıktan sonra yaklaşık 40 saniye sonra popup pencerede uyarı sayfamızın çıkacağını göreceğiz. Eğer bu penceredeki süre bitmeden butona tıklayıp, yaklaşık 30 saniye bekleyip Default.aspx sayfasındaki Oturumu Kontrol Et butonuna tıklarsak halâ oturumun devam ettiğini görürüz. Eğer popup penceredeki süre bittiğinde hiçbir işlem yapmamışsak, Default.aspx sayfasında dönüp Oturumu Kontrol Et butonuna tıklarsak oturumun kapandığını görebiliriz.

Bu şekilde sitemizde oturum açmış olan bir kullanıcıya oturum zamanı bitmeden bir süre önce uyarı vermiş ve isteğe bağlı olarak oturum süresini uzatmış olduk. Günümüzde özellikle bankacılık uygulamalarına giriş yapabilmek için birkaç adımdan oluşan bilgi doğrulama ekranlarını ve cep telefonumuza gelen SMS'lerdeki şifreleri beklemek zorundayız. Bu tip uygulamalarda birkaç dakikalığına işlem yapmadığımızda farkında olmadan oturumumuzun kapatılması ve yeniden aynı süreçten geçip sisteme giriş yapmamız her ne kadar güvenlik için gerekli olsa da kullanıcı memnuniyetini azaltan bir durum. Örneğimizin güvenlik açısından hiçbir sakıncası olmadığı gibi gereksiz zaman kayıplarını azaltmak için web uygulamalarında kullanabileceğimiz güzel bir pratik olacaktır.

7 Aralık 2011 Çarşamba 16:27

Yorum - RSSYorumlar (4)

Etiket: , ,
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Nedirtv - Aralık Ayı Webinerleri

Nedirtv webinerleri tüm hızıyla devam ediyor. Bu ay 5 farklı konuda gerçekleşecek webiner programnı aşağıda bulabilirsiniz. Bu linkten Facebook etkinliğimize kayıt olabilirsiniz. Etkinliğe kayıt olduğunuzda, webiner günlerinde hesabınıza hatırlatma mesajı gönderilecektir. Ayrıca www.nedirtv.com/webinerler adresinden katılmak istediğiniz webinerlerin "Takvimine Al" linkini kullanarak Microsoft Outlook vb. programların ajandalarına webinerleri kaydedebilirsiniz.

Konu: Entity Framework ile Gerçek Hayat Örnekleri-1
Tarih: 12 Aralık 2011 Pazartesi - 21:00
Link: https://www.livemeeting.com/cc/mvp/join?id=Z3THGT&role=attend
Konuşmacı: Burak Selim ŞENYURT

Konu: Entity Framework ile Gerçek Hayat Örnekleri-2
Tarih: 13 Aralık 2011 Salı - 21:00
Link: https://www.livemeeting.com/cc/mvp/join?id=8FPTD6&role=attend
Konuşmacı: Burak Selim ŞENYURT

Konu: CRM 2011 Programlama Teknikleri
Tarih: 19 Aralık 2011 Pazartesi - 21:00
Link: https://www.livemeeting.com/cc/mvp/join?id=9N5553&role=attend
Konuşmacı: Barış KANLICA

Konu: Cambaz Debugger - C# Uygulamalarında Hata Ayıklama
Tarih : 24 Aralık 2011 Cumartesi - 21:00
Link : https://www.livemeeting.com/cc/mvp/join?id=SP7FZ9&role=attend&pw=5%2BK7Hd5cW
Konuşmacı: Fatih BOY

Konu: C#'ın Geleceğine Bir Bakış
Tarih : 26 Aralık 2011 Pazartesi - 21:00
Link : https://www.livemeeting.com/cc/mvp/join?id=NJD5T2&role=attend&pw=3%229Z%3CTp%2CW
Konuşmacı: Fatih BOY

6 Aralık 2011 Salı 19:18

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET WebForms'da Sahte Sessionless Sayfalar Üretmek

Başlıkta neden "Sahte Sessionless Sayfa" dediğimi düşünebilirsiniz, nedeni ASP.NET Webforms'da sessionless(yani session taşımayan) sayfa yapmak mümkün değil. Mümkünse de ben 2 gün boyunca denedim, araştırdım, internette çözümünü bulamadığım gibi hatırı sayılır kaynaklarda "InProc modda sessionless sayfa olmaz" bilgilerini gördüm. Ancak bu yazıda bir projede sessionless bir sayfadan beklentimiz ne ise, onu gerçekleştirmemizin yolunu anlatacağım. Yani sahte sessionless sayfaları nasıl kullanabileceğimizi inceleyeceğiz.

Konuya giriş yapmadan önce neden böyle birşeye ihtiyaç duyabileceğimizi izah etmeye çalışayım. Bildiğiniz gibi Session belirli bir zaman aşım süresi olan ve istemcinin sunucuya talep yapmasıyla bu sürenin ötelenmesi mantığıyla çalışan bir nesnedir. Bir web uygulamasında oturum açtıktan sonra size (genellikle) 20 dakikalık bir süre verilir. Bu süre bitmeden yapacağınız her talepte süre yeniden 20 dakika olarak belirlenir ve önünüzdeki 20 dakika boyunca web uygulaması tarafından tanınırsınız. Bu durum web uygulamasındaki tüm dosyalar için geçerlidir. Yani siz aspx, ashx, htm gibi bir dosyaya talep yaptığınızda istemciden alınan SessionID sunucuya iletilir ve sunucu sizi tanıyarak oturumunuzu 20 dakika daha geçerli yapar. Peki, "uygulamamdaki bir dosyaya talep yapıldığında session çalışmasın ve zaman aşım süresi ötelenmesin" gibi bir isteğim olursa bunu nasıl yapabilirim? Zira uygulamadaki uzantısına bakılmaksızın hangi dosyaya talep yapılırsa yapılsın, session süresi uzar demiştik. Yani istemci bir sayfaya talep yapsın ama bu talep esnasında session işlemesin durumunu gerçekleştirmek istiyoruz.

Yukarıdaki paragrafı okuduğunuzda "tamam ben sorunu anladım, ama benim böyle bir senaryoya niye ihtiyacım olsun ki?" diyebilirsiniz. Bir aksilik olmazsa size bu konunun uygulandığı güzel bir örnek içeren yazıyı yakın bir zamanda blogumda göreceksiniz diyeyim ve az da olsa sizleri meraklandırayım :)

Öncelikle normal şartlarda session nasıl çalışıyor görelim, sonrasında da neleri değiştirerek sahte sessionless sayfa üretebileceğimizi inceleyelim. Projede yer alan bir alt klasörü ayrı bir uygulama olarak tanımlamamız gerekiyor, bu nedenle projeyi local IIS üzerinde oluşturmamız ve Visual Studio'dan da Local IIS sekmesini kullanarak projeyi açmamız gerekecek. Projeye adları Default.aspx, Default2.aspx ve subsite adındaki bir dizinde FarkliSession.aspx adıyla 3 dosya ekliyorum. Anlaşılacağı üzere sahte sessionless sayfamız olan FarkliSession.aspx'i ancak farklı bir dizinde tanımlayarak kullanabiliyoruz. Örneği incelemek için bir butonun click eventinde gelişigüzel bir Session nesnesi oluşturarak tüm sayfalardaki SessionID bilgisine bakıyoruz. Aşağıdaki 3 sayfamızın kodları görünmektedir.

//Default.aspx
public partial class _Default : System.Web.UI.Page
{
    protected void Page_PreRender(object sender, EventArgs e)
    {
        if(Session["dummy"] != null)
            Response.Write("SessionID: " + Session.SessionID);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["dummy"] = "herhangi bir değer";
    }
}
//Default2.aspx
public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("SessionID: " + Session.SessionID);
    }
}
//subsite/FarkliSession.aspx
public partial class subsite_FarkliSession : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("SessionID: " + Session.SessionID);
    }
}

Default.aspx sayfasını çalıştırıp oturum açıyoruz ve sonrasında yeni pencerelerde Default2.aspx ve FarkliSession.aspx sayfalarını açıyoruz. Aşağıdaki ekran görüntüsünden de anlaşılacağı üzere tüm sayfalarda SessionID aynı.


Tüm sayfalarda SessionID aynı gelmekte

Resimde gördüklerimiz zaten beklenen değerler. Gelelim FarkliSession.aspx sayfasını sessionless yapmaya. Bu işlem için öncelikle subsite isimli klasörü IIS'de Convert Application seçeneğinden bir uygulamaya çeviriyoruz. Aşağıdaki resimden ilgili işlemi yapacağımız menüyü görebilirsiniz.


subsite isimli dizini IIS'den ayrı bir uygulamaya çeviriyoruz

Artık bu dizin IIS bazında uygulamadan ayrı çalışacaktır. Ancak bu işlem sessionless sayfa üretmek için yeterli değildir, zira yukarıda Default.aspx sayfasında butona tıklatarak izlediğimiz işlemleri tekrarlarsanız halâ sayfalarda aynı SessionID'lerin olduğunu görürsünüz. subsite dizini uygulamadan ayrılsa dahi IIS bu dizindeki dosyalarında istemciye gönderilmesi esnasında aynı isimli Cookie dosyalarını kullandığı için aynı cookie'lere sahip sayfalar olmakta ve aynı SessionID bilgisini taşımaktadırlar. İşlemin son adımında subsite dizini içerisine bir web.config dosyası ekliyor ve bu dizindeki dosyalara ait çerezlerin farklı bir cookieName bilgisine sahip olduklarını belirteceğiz. Aşağıda subsite dizinine eklediğimiz web.config dosyasının içeriği yer almaktadır.

 subsite/web.config
<?xml version="1.0"?>
<configuration>
    <system.web>
      <sessionState cookieName="subsite_cookie"></sessionState>
    </system.web>
</configuration>

Bu değişikliği de yaptıktan sonra artık FarkliSession.aspx sayfasının farklı bir SessionID'ye sahip olduğunu görebiliyoruz. En azından aşağıdaki resimde öyle görünüyor :)


Yapılan düzenlemelerden sonra subsite dizini altındaki sayfalarda farklı bir SessionID'ye ulaşıyoruz

Bu şekilde farklı bir uygulamaya ihtiyaç duymadan, aynı uygulama altına IIS'de bir alt uygulama tanımlayarak sahte sessionless sayfa kullanabiliyoruz. Yazının başından beri "Sahte" kelimesini kullanmamızın sebebi, aslında bu sayfanın ana uygulamadaki session'dan farklı olarak ayrı bir session nesnesi taşıyor olmasıdır.

17 Kasım 2011 Perşembe 17:32

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Nedirtv.com Webinerleri Yeniden Başlıyor

Nedirtv webinerlerine yeniden başlıyoruz. Kasım ayı içerisinde gerçekleştireceğimiz üç webinere ait bilgilere aşağıdan ulaşabilirsiniz.

Not: Webinerlere katılmak için sadece bir defaya mahsus bilgisayarınıza Office Live Meeting'i kurmanız gerekmektedir. Webiner saatinden 15 dakika önce webiner linkine tıkladığınızda, gerekli kurulum için yönlendirmeler yapılacaktır.

Facebook Etkinliğine kayıt olun >>
Linkedin Etkinliğine kayıt olun >>

 

Konu: NoSQL Nedir? - MongoDB ile .NET Kardeşliği
Tarih: 14 Kasım Pazartesi 21:00
Konuşmacı: İbrahim ATAY
Link: https://www.livemeeting.com/cc/mvp/join?id=N7732S&role=attend

Konu: SQL Server - Stored Procedure ve Function
Tarih: 21 Kasım Pazartesi 21:00
Konuşmacı: Görkem SEZGİN
Link: https://www.livemeeting.com/cc/mvp/join?id=Q24KBF&role=attend

Konu: HTML 5
Tarih: 28 Kasım Pazartesi 21:00
Konuşmacı: Cemil UZUN
Link: https://www.livemeeting.com/cc/mvp/join?id=H7GTWK&role=attend

 

10 Kasım 2011 Perşembe 11:08

Yorum - RSSYorumlar (0)

Etiket:
Kategori:

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Takip Et

RSS Feed twitter friendfeed

Seminer/Webiner Programım

  • Seminer-WebinerASP.NET Workshop - 2. Gün (Kadir Has Üniversitesi(İstanbul))
    11 Aralık 2011

  • Seminer-WebinerASP.NET Workshop - 1. Gün (Kadir Has Üniversitesi(İstanbul))
    10 Aralık 2011

  • Seminer-WebinerEnterprise Library 5.0 (Microsoft Türkiye İstanbul Ofisi)
    2 Nisan 2011

>> Etkinlik Takvimi