Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!  
Daron Yöndem - Wednesday, August 20, 2008
bir yazılımcının tasarıları...
 Wednesday, August 20, 2008

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.

Wednesday, August 20, 2008 7:57:03 AM (GTB Standard Time, UTC+02:00)  #    Comments [9]   ASP.NET 3.5 | IIS 7.0  | 
 Tuesday, August 19, 2008

Son iki gündür İzmir Microsoft Yaz Okulundaydım. Microsoft Yaz Okulu serisinin son durağı olan İzmir'de de Silverlight ve WPF konularına eğildik. İzmir ekibini :) İstanbul ve Ankara ile karşılaştırmak gerekirse sanırım İzmir'in havasından olsa gerek çok daha "fırlama" denilebilecek bir ekip vardı :) Beni bir çok kez dersi kaynatma konusunda kışkırtsalar da azimle iradeli bir şekilde görevimi sürdürdüm :)

İzmir Microsoft Yaz Okulu, Öğle Yemeği
İzmir Microsoft Yaz Okulu, Öğle Yemeği

Söz verdiğim gibi iki gün boyunca yaptığımız örnekleri kaynak kodları ile beraber sizlerle paylaşıyorum, aşağıdan tüm projeleri indirebilirsiniz.  

Örnek Uygulamalar - 19082008_1.rar (3,55 MB)

İstanbul, Ankara ve İzmir'den tüm yaz okulundaki öğrencilerime son olarak teşekkür etmek istiyorum. Hepsi de eminim ki önümüzdeki dönemde çok güzel projelere imza atacaklar.

Keep in touch ;)

Tuesday, August 19, 2008 11:03:19 AM (GTB Standard Time, UTC+02:00)  #    Comments [8]   Eğitimler | Silverlight 2.0 | WPF  | 
 Monday, August 18, 2008

WPF uygulamalarında "Splash Screen" hazırlama ile ilgili sıkıntılara yönelik elle hazırlanmış taktikler ve farklı çözümler vardı. .NET Framework 3.5'in SP1 güncellemesi ile beraber artık WPF uygulamaları için native Splash Screen hazırlamak gerçekten çocuk oyuncağına dönüştü.

Yarattığınız herhangi bir WPF uygulamasının Solution'ına istediğiniz bir JPEG veya şeffaflık içeren PNG dosyasını ekleyin. Bunun için ister Visual Studio içerisinde ister Blend içerisinde projeye "Solution Explorer" içerisinde sağ tıklayarak gelen menüden "Add Existing Item" diyerek ilerleyebilirsiniz. Önemli olan adım söz konusu dosyayı projeye ekledikten sonra onun "Build Action"ınını "Splash Screen" olarak değiştirmek.

WPF içerisinde Splash Screen ayarlamak.
WPF içerisinde Splash Screen ayarlamak.

Visual Studio içerisinde söz konusu dosyayı seçtikten sonra "Properties" panelinden "Build Action" özelliğini yukarıdaki şekilde değiştirdiğinizde artık programınızın belleğe yüklenene kadar seçmiş olduğun görsel gösterilecektir. Maalesef bu Splash Screen'in tasarımını XAML ile düzenlemek veya animasyonlu GIF kullanmak gibi seçenekler şu anda mevcut değil, fakat şeffaf PNG kullanabiliyor olmak gerçekten güzel ve çözüm ise çok pratik.

Hepinize kolay gelsin.

Monday, August 18, 2008 10:50:13 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]   WPF  | 
 Sunday, August 17, 2008

Bundan yaklaşık bir hafta kadar önce Adobe sponsorluğundaki RiaTalks etkinliğinde Silverlight anlatmıştım. Sizleri hem aktivite öncesi hem de sonrası blogdan bilgilendirmiştim. İşte o aktivitede yine ufak bir video çalışmamız oldu. Video konusundaki yardımlarından dolayı Murat Duman'a teşekkür ediyorum. İyi seyirler...

Sunday, August 17, 2008 11:14:48 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight | Silverlight 2.0  | 
 Saturday, August 16, 2008

Sanalkurs.net'i duyanlarınız vardır. Sanalkurs.net'in bir de sanal ortamda dağıtılan SanalKurs adında dergisi var. Derginin altıncı sayısının yayınlandığı bugünlerde ben de dergide bir röportaj ile yerimi aldım. Sevgili Çağdaş Saygılı'ya güzel soruları ve emeği için buradan teşekkür ediyorum.

SanalKurs'un altıncı sayısı yayında.
SanalKurs'un altıncı sayısı yayında.

Dergiye aşağıdaki adresten ulaşabilirsiniz;

http://www.sanalkurs.net/e-dergi-6.html

Saturday, August 16, 2008 10:06:08 AM (GTB Standard Time, UTC+02:00)  #    Comments [8]    | 
 Friday, August 15, 2008

Silverlight'ın sunucu tarafındaki programlama dillerinden ve sunucu platformundan tamamen bağımsız olduğundan sürekli bahsediyoruz. Bu çerçevede daha önceki yazılarımdan birince PHP ile Silverlight 2.0 kullanımına değinmiştim. Bu yazımızda da Java ile Silverlight kullanımına değineceğiz.

Örneğimizde Java tarafından hazırladığımız bir web servisini Silverlight 2.0 tarafında Visual Studio içerisinden kullanacağız. Visual Studio ve .NET altyapısı ile rahatlıkla WSDL uyumlu web servislerini kullanabildiğimizi düşünürsek aynı standartlara uygun bir web servisinin Java ile hazırlanmış olması durumunda herhangi bir sorun yaşamayacağımıza kesin gözü ile bakabiliriz. İlk olarak Java tarafında aşağıdaki kodumuz ile basit bir web servisi hazırlayalım.

package com.daron.ws;

 

public class wsclass {

 

    public int topla(int x, int y)

    {

        return x+y;

    }

 

}

Yukarıdaki ufak kod ile aslında basit bir metod tanımlamış oluyoruz. Metodumuz aldığı iki integer parametreyi toplayıp geri döndürüyor. Bu parametreler ve metodun yapacağı işlemler sizin örneklerinizde çok daha farklı olabilir. Şu an için amacımız Silverlight tarafından Java'ya veri gönderip geriye sonuç alabiliyor olmak.

Eclipse üzerinden WSDL dosyasını da otomatik olarak yukarıdaki metod üzerinden yarattıktan sonra artık sıra geliyor bu servisi Silverlight tarafında kullanmaya. Silverlight 2.0 uygulamamızı yine Visual Studio içerisinde geliştireceğimiz için Java servisinin bulunduğu siteyi Visual Studio içerisinde de açmanız daha rahat bir çalışma ortamı yaratacaktır. Basit bir şekilde Visual Studio 2008 içerisinden "File / Open Web Site" diyerek Java ile hazırlanmış siteyi açabilirsiniz. Tabi Java dosyalarını sadece birer dosya olarak göreceksiniz, düzenleme şansınız olmayacak. Siteyi açtıktan sonra "File / Add / New Project" diyerek Silverlight projenizi sitenize ekleyebilirsiniz. Silverlight uygulamasını çalıştıracak olan örnek HTML dosyası otomatik olarak Java sitenize eklenecektir.

Web servisini referans alalım...

Web servisini referans olarak ekleyebilmeniz için tabi ki servisin çalışıyor olması gerek. Bunun için Eclipse üzerinden Tomcat'i kullanabilirsiniz. IIS yüklü bir makinede çalışıyorsanız 8080 gibi harici bir port vermeyi unutmayın. Web servisini tarayıcınızda çalıştırdıktan sonra adresini kopyalayarak Silverlight projenize sağ tıklayarak "Add Service Reference" diyerek referans ekleme işlemini tamamlayabilirsiniz.

Java web servisimizi referans olarak ekliyoruz.
Java web servisimizi referans olarak ekliyoruz.

Referans ekleme işlemi tamamlandığında artık Silverlight ile herhangi bir web servisini kullanır gibi Java web servisimizi de kullanabiliyoruz. Örneğimizi çalıştırabilmek için ilk olarak Silverlight ekranımıza iki metin kutusu ve bir de düğme yerleştirelim.

<UserControl x:Class="SilverlightApplication1.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="400" Height="300">

    <Grid x:Name="LayoutRoot" Background="White">

      <TextBox Height="48.411" Margin="33.2830009460449,22.693000793457,115.582000732422,0" VerticalAlignment="Top" Text="TextBox" TextWrapping="Wrap" x:Name="Kutu1"/>

      <TextBox Height="48.95" Margin="33.2830009460449,75.1039962768555,115.582000732422,0" VerticalAlignment="Top" Text="TextBox" TextWrapping="Wrap" x:Name="Kutu2"/>

      <Button Height="52.95" HorizontalAlignment="Stretch" Margin="92.2839965820313,0,165.50700378418,88.1999969482422" VerticalAlignment="Bottom" Content="Button" x:Name="Dugme"/>

    </Grid>

</UserControl>

Her şey hazır olduğuna göre artık web servislerimizi kodumuz ile tanımlayıp kullanabiliriz.

[VB]

Partial Public Class Page

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    Private Sub Dugme_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Dugme.Click

        Dim Servisim As New ServiceReference1.wsclassClient

        AddHandler Servisim.toplaCompleted, AddressOf Servisim_toplaCompleted

        Servisim.toplaAsync(Kutu1.Text, Kutu2.Text)

    End Sub

 

    Private Sub Servisim_toplaCompleted(ByVal sender As Object, ByVal e As ServiceReference1.toplaCompletedEventArgs)

        Dugme.Content = e.Result

    End Sub

End Class

[C#]

namespace SilverlightApplication2

{

    public partial class Page : UserControl

    {

        ServiceReference1.wsclassClient Servisim = new SilverlightApplication2.ServiceReference1.wsclassClient();

 

        public Page()

        {

            InitializeComponent();

            this.Dugme.Click += new RoutedEventHandler(Dugme_Click);

            Servisim.toplaCompleted += new EventHandler<SilverlightApplication2.ServiceReference1.toplaCompletedEventArgs>(Servisim_toplaCompleted);

        }

 

        void Dugme_Click(object sender, RoutedEventArgs e)

        {

            Servisim.toplaAsync(int.Parse(Kutu1.Text), int.Parse(Kutu2.Text));

        }

 

        void Servisim_toplaCompleted(object sender, SilverlightApplication2.ServiceReference1.toplaCompletedEventArgs e)

        {

            Dugme.Content = e.Result.ToString();

        }

    }

}

Konumuz Silverlight ile web servisleri kullanımı olmadığı için yukarıdaki kodun detaylarına girmeyeceğim. Bu konuda detaylı bir yazıyı aşağıdaki adresten inceleyebilirsiniz.

http://daron.yondem.com/tr/PermaLink.aspx?guid=19fe09b2-2987-4369-a5d5-58e0641c8d6b

Kodları incelediğimizde yaptığımız şeyin aslında ASP.NET ile hazırlanmış bir web servisi kullanmaktan farklı olmadığını görüyoruz. Java ile yazılmış olan web servisimiz yine Silverlight tarafından asenkron olarak kullanılabiliyor.

Projenizi Visual Studio içerisinde Build ederek Silverlight XAP dosyasını oluşturduktan sonra siteyi Tomcat üzerinden çalıştırmak zorunda olduğunuzu unutmayın. Aksi halde web servisi çalışmayacağı için Silverlight hata verecektir.

Sonuç

Silverlight'ın güzelliklerinden faydalanmak için ASP.NET tarafında olmanız şart değil. İster Java ister PHP ister herhangi bir sunucu taraflı programlama dili kullanın Silverlight ile kullanıcı arayüzünüzü hazırlayabilirsiniz.

Java ile WSDL uyumlu web servisi hazırlayıp çalıştırabilme :) konusundaki yardımlarından dolayı sevgili Bilge Başaltun'a buradan çok teşekkür ediyorum.

Hepinize kolay gelsin.

Friday, August 15, 2008 1:12:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight 2.0  | 
 Thursday, August 14, 2008

AJAX kullanılan sitelerde tarayıcıların "Geri" düğmesinin çalışmaması sorunu ile ilgili farklı JavaScript kütüphanelerinde çözümler bulunsa da ASP.NET ile sunucu tarafında kullanılabilecek tek bir çözüm vardı. Aşağıdaki adresten söz konusu çözüm ile ilgili makaleyi inceleyebilirsiniz.

http://daron.yondem.com/tr/PermaLink.aspx?guid=1e6b22ff-cf0b-4927-a396-4eb5446daaa4

Bahsettiğimiz çözüm ASP.NET harici özel bir sunucu kontrolünün kullanılmasına dayalı. Oysa artık bunlara ihtiyacımız yok. .NET Framework 3.5'in SP1 güncellemesi ile beraber artık ASP.NET AJAX altyapısı istemci tarafındaki tarayıcı geçmişinin de kontrol edilebilmesine olanak tanıyor. Gelin sistemin kullanım şeklini beraber inceleyelim.

ScriptManager'da yeni bir özellik : EnableHistory

Ufak bir örnek yaparak uygulama üzerinden ilerleyelim. Örneğimizde sayfamızda UpdatePanel içerisinde bir Label ve bir de Button bulunsun. Düğmeye her bastığımızda basit bir şekilde Label'ın içerisindeki sayıyı bir arttırsın. Amacımız bu şekilde UpdatePanel'in içi değişirken tarayıcının geçmişini de yenileyerek tarayıcıdaki "Geri" ve "İleri" düğmelerinin çalışmasını sağlamak.

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <asp:ScriptManager EnableHistory="true" ID="ScriptManager1" runat="server">

    </asp:ScriptManager>

    <div>

        <asp:UpdatePanel ID="UpdatePanel1" runat="server">

            <ContentTemplate>

                <asp:Label ID="Label1" runat="server" Text="0"></asp:Label>

                <asp:Button ID="Button1" runat="server" Text="Button" />

            </ContentTemplate>

        </asp:UpdatePanel>

    </div>

    </form>

</body>

</html>

Yukarıdaki örnek sayfa içerisinde gördüğünüz kodun normal bir ASP.NET AJAX uygulamasından tek farkı ScriptManager kontrolünün EnableHistory özelliğinin True olarak ayarlanmış olması. Bu özellik ScriptManager kontrolüne .NET Framework 3.5 SP1 güncellemesi ile beraber eklendi. Tabi sadece bu ayarı değiştirmiş olmak her şeyin çalışması için yeterli değil.

AJAX ile sayfada yapılan değişikliklerin hangilerinin birer "yeni sayfa" niteliği taşıdığına karar vermemiz gerekiyor. Böylece tarayıcı doğru durumları kendi geçmişine ekleyecektir. Bunun için sayfamızın kod kısmına geçerek bizim örneğimizde AJAX isteğine neden olan Button kontrolünün arkasında saklı koda göz atalım.

[VB]

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Label1.Text = CInt(Label1.Text) + 1

        ScriptManager1.AddHistoryPoint("sayi", Label1.Text)

    End Sub

[C#]

    protected void Button1_Click(object sender, EventArgs e)

    {

      Label1.Text = (int.Parse(Label1.Text) + 1).ToString();

      ScriptManager1.AddHistoryPoint("sayi", Label1.Text);

    }

Gördüğünüz üzere kodumuzun ilk satırında basit bir şekilde Label içerisindeki değeri bir arttırıyoruz. Son olarak elde ettiğimiz değeri ayrıca ScriptManager üzerinden AddHistoryPoint komutu ile istemci tarafında bir tarayıcı geçmişi noktası olarak kaydediyoruz. AddHistoryPoint komutu toplamda iki parametre alıyor (Key/Value Pair), birincisi sizin tamamen kendi isteğinize göre tanımlayabileceğiniz bir string değer, diğeri ise bu string değer ile eşleşen değişkenin ta kendisi. Örneğin eğer web sayfamız farklı ürünlerin gösterildiği bir sayfa olsaydı bu noktada string değer olarak "ID" verip ikinci parametre olarak da gösterilen ürünün primary key değerini aktarabilirdik. Tüm bu değerler bize ileride geri döndürülüyor olacak.

Tarayıcı geçmişine yeni bir nokta ekledik ve tarayıcımızı sayfanın değiştiğinden haberdar ettik. Hatta değişen sayfa ile ilgili ufak bir bilgiyi de AddHistoryPoint sayesinde kaydetmiş olduk. Şimdi sıra geldi web sitemizin kullanıcısı tarayıcının "Geri" veya "İleri" tuşlarına tıkladığında bizim durumu nasıl algılayarak uygun hareketleri yapacağımızı belirlemeye. Bunun için sunucu tarafında ScriptManager'ın Navigate adındaki event-handler'ını kullanacağız.

[VB]

    Protected Sub ScriptManager1_Navigate(ByVal sender As Object, ByVal e As System.Web.UI.HistoryEventArgs) Handles ScriptManager1.Navigate

        Label1.Text = e.State("sayi")

    End Sub

[C#]

    void ScriptManager1_Navigate(object sender, HistoryEventArgs e)

    {

        Label1.Text = e.State["sayi"];

    }

Navigate event-handler'ına gelen HistoryEventArgs üzerinden State dizisine daha önce AddHistoryPoint derken verdiğimiz anahtar stringi ilettiğimizde eşleştirilmiş olan değeri alabiliyoruz. Böylece kullanıcı bir önceki sayfaya gitmek istediğinde o sayfa yaratılırken eklemiş olduğumuz HistoryPoint ile eşleştirilmiş değeri yakalayabileceğiz. Bizim örneğimizde sayfayı eski haline getirmek için söz konusu değeri Label'ın içine aktarmak yeterli oluyor. Eğer bu değer bir ürüne ait primary key olsaydı tekrar veritabanını sorgulayarak sayfayı uygun verilerle dolduracak bilgileri çekecektik.

Sonuç

Aslına bakılırsa gerçek anlamı ile bir "Geri" navigasyonu sağlamıyoruz. Tarayıcının "Geri" düğmesine basıldığında bir önceki sayfayı tekrar AJAX ile oluşturuyoruz. İstemci tarafında bu durum sanki geri gidilmiş gibi algılanıyor, oysa veriler tekrar sunucudan geliyor. Maalesef bunun şu an için farklı bir çözümü yok.

Diğer yandan tarayıcının sayfa değişmemesine rağmen sayfa değişmiş gibi davranmasını sağlamak için de sayfa adresine aşağıdaki gibi anchor bilgileri ekleniyor. Bu durum site içerisinde anchor kullanımını engelleyecektir. Diğer yandan anchor içerisinde AddHistoryPoint ile eklediğimiz tüm veriler encrypt edilerek saklandığı için bu verilerin olabildiğince güvenlik seviyesinin düşük olmasında da fayda var.

http://localhost:54366/Default.aspx#&&/wEXAQUEc2F5aQUBMrCb2/2XpreE0oVczcMgPShkFLH/

Son olarak yukarıdaki gibi linklerin yaratılması ile beraber artık AJAX sayfalarında da sitenin farklı durumlarının farklı web adreslerine sahip olduğunu unutmayalım. Böylece AJAX ile çalışan bir sitede gezildiğinde kullanıcılar tam olarak içerisinde bulundukları görsel sayfanın adresini kopyalayarak paylaşabileceklerdir.

Hepinize kolay gelsin.

Thursday, August 14, 2008 2:58:55 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]   AJAX  | 
 Wednesday, August 13, 2008

Son iki gündür Ankara'da Microsoft Yaz Okulu'nda Silverlight ve WPF konularını anlattım. Ankara, İstanbul ve İzmir'de yapılan yaz okullarındaki öğrencilerin arasındaki sinsi çekişme ortamı hoşuma gitmedi diyemem :) Örneğin Ankara'daki arkadaşlar İstanbul'daki arkadaşlarla ilgili "Haremlik ve Selamlık şeklinde oturuyorlarmış sanırım hocam" şeklinde yorumlarda bile bulundular :) Tabi şaka bir yana yaz okullarındaki bu gençlerin önümüzdeki yılda çok güzel işler yapacağından eminim. Hatta büyük ihtimal ile bazılarının adlarını sürekli duyuyor olacaksınız, şimdiden BlogEngineTR ekibine katılanlar bile var. Azimlerini takdir ediyorum.

Microsoft Yaz Okulu, Ankara
Microsoft Yaz Okulu, Ankara

Tüm eğitim ve seminerlerimde olduğu gibi yaz okulunda da tamamen spontane örneklerle ilerledim. Yaptığımız uygulamalarının toparlayabildiğim kadarının kaynak kodlarını aşağıdaki adresten indirebilirsiniz.

Örneklere ait kaynak kodları - 13082008_2.rar (5,77 MB)

Son olarak, "Hocam bu üniversiteye gelir misiniz?" "Şuraya gider misiniz?" gibi sorularla sıkça karşılaştığım için buradan cevap vermek istiyorum. "Şu ana kadar davet edilip de gitmediğim bir yer olmadı" :)

Hepinize kolay gelsin...

Wednesday, August 13, 2008 12:45:38 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   Silverlight 2.0 | WPF  | 
 Tuesday, August 12, 2008

Visual Studio 2008 SP1 yüklemesi sonrası Silverlight 2 Beta 2 ile çalışanlar artık çalışamadıklarını görecekler :) Bu nedenle yeni bir yükleme paketi Microsoft tarafından hazırlandı. İlk olarak bilgisayarınızdan Silverlight 2 ile ilgili her şeyi silin ve sonrasında aşağıdaki adresten gerekli yüklemeyi bilgisayarınıza indirerek çalıştırın.

http://www.microsoft.com/downloads/details.aspx?FamilyId=50A9EC01-267B-4521-B7D7-C0DBA8866434&displaylang=en

Kolay gelsin ;)

Tuesday, August 12, 2008 7:57:57 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0  | 
 Monday, August 11, 2008

Visual Studio 2008 SP1 ile beraber .NET Framework 3.5 SP1 de yayınlandı. .NET Framework tarafında gerçekten güzel gelişmeler var. İlk olarak son günlerde yayınlanan SQL 2008 desteği artık karşımıza. Tabi gelişmeler bu kadarla kalmıyor, ADO.NET Data Services ve ADO.NET Entity Framework'de artık kullanılabilir durumda.

WPF tarafında WebBrowser kontrolü ve DirectX altyapısından PixelShader desteği geliyor. .NET Framework 3.5'i aşağıdaki adresten bilgisayarınıza indirebilirsiniz.

http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7&DisplayLang=en

Monday, August 11, 2008 7:52:27 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Sunday, August 10, 2008

Visual Studio 2008 SP1 ile beraber daha önce sizlere blogumdan bahsetmiş olduğum yeniliklerin neredeyse hepsi geliyor :) İlk olarak "client deployment" yani sadece istemci tarafında çalışacak uygulamalar için .NET Framework'ün sadece gereken kısmının aktarılmasına dair altyapı hazır durumda. Böylece istemci tarafına tam bir .NET Framework yüklemesi aktarmaya gerek kalmıyor, malum şu an .NET Framework içerisinde ASP.NET gibi sunucu taraflı kütüphanaler de bulunuyor, oysa biz bunları istemcilere hiçbir zaman yüklemiyoruz. Yeni "Client Profile" yüklemesinin boyutu sadece 26MB.

Visual Studio 2008 SP1 Yüklemesi
Visual Studio 2008 Express sürümleri SP1
Visual Studio 2008 TFS SP1

Visual Studio 2008 SP1 içerisinde dikkatimi çeken diğer yeniliklerden birkaçı ise JScript formatlama seçeneği IIS Module ve HttpHandler şablonları oldu. Yeni oyuncaklarımız hazır :)

Sunday, August 10, 2008 7:50:58 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   Visual Studio 2008  | 
 Saturday, August 09, 2008

Cuma ve cumartesi günlerimi riatalks.com aktivitesinde geçirdim. Benim de cuma akşam üstü bir Silverlight sunumum vardı. Her konuşmacıya 45 dakika ayrıldığı için benim açımdan epey sıkıntılı bir manzara oluştu. Hakkında hiç bir bilgi sahibi olunmayan bir teknoloji olarak Silverlight ile ilgili doğru manzarayı yaratacak bilgileri 45 dakikada aktarmak gerçekten çok zor. Yine de elimden geleni yaparak "Hiç yoktan iyidir" söylemleri ile sunumumu bitirdim.

riatalks.com'da Silverlight oturumu.
riatalks.com'da Silverlight oturumu.

INETA Summer Hit'den hatırlayacağınız birkaç konuşmacımız da riatalks'da söz alma şansına sahip oldu. Alışmışken riatalks için de bir video çekimi yaptık, özellikle Ali Rıza'ya performansından dolayı teşekkür etmem gerek. Video son haline geldiğinde sizinle paylaşacağım.

Saturday, August 09, 2008 9:45:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]   Silverlight 2.0  | 
 Friday, August 08, 2008

INETA Summer Hit boyunca sinsi röportajlarımız da devam etti. Aktiviteyi özetleyen bu video içerisinde bahsettiğim mini röportajları da bulabilirsiniz (Videonun sonuna dikkat :)). Eğitim videolarını yayınlama konusunda ise çalışıyoruz, blogdan duyurulara devam edeceğim.

Friday, August 08, 2008 8:15:39 AM (GTB Standard Time, UTC+02:00)  #    Comments [11]    | 
 Thursday, August 07, 2008

Uzun süredir beklediğimiz SQL 2008 sonunda RTM oldu ve bugün MSDN aboneleri tarafından indirilebiliyor. Böylece 2008 serisi ürünlerin hepsi tamamlanmış oldu. SQL 2008'in ücretsiz olan Express sürümünü aşağıdaki adresten edinebilirsiniz.

http://www.microsoft.com/sqlserver/2008/en/us/default.aspx

SQL Server 2008 Logo

SQL Server 2008'in yazılım geliştiriciler için getirdiği yeniliklerden bahseden yazılarımı "yazılacak yazılar" listeme aldım :)

Hepinize kolay gelsin.

Thursday, August 07, 2008 8:12:06 AM (GTB Standard Time, UTC+02:00)  #    Comments [2]   SQL Server 2008  | 
 Wednesday, August 06, 2008

Bugün sonunda herkesten INETA Summer Hit boyunca çektikleri fotoları toparlamayı başardım ve güzel çıkanlardan bir arşiv düzenledim. Arşivden özellikle birkaç fotoğrafa değinmek istiyorum :)

Yemeğe yolculuk
Yemeğe yolculuk

Aktivite boyunca öğlen yemekleri için YTÜ'den Beşiktaş'a doğru bir yürüyüş yaptık. Elimizde pankartlar olsa herhalde polisin çevirebileceği bu büyük kitle ile Burger King, Pizza Hut ve KFC üçlüsünü zengin ettiğimizi söylemek yalan olmaz. Foto biraz daha kuş bakışı olsaydı bu yürüyüşün uzunluğunu daha net görebilirdiniz.

Tavşan Eralp iş başında!
Tavşan Eralp iş başında!

Sevgili Eralp Erat her zamanki gibi konuşmasını zamanında bitiremeyince ben de arkadan müdahale etmek durumunda kaldım. Birkaç ufak şaka sonrası Eralp mesajımı aldı ve zamanında salonu terk edebildik. Aslında gönül isterdi ki devam edelim fakat salın görevlilerini mesaileri haricinde orada tutmak hakkımız yoktu. Yukarıdaki sahneyi yakalamak için o anda fotoğraf makinesine sarılanların sayısını tahmin edemezsiniz :)

Rap Zamanı!
Rap Zamanı!

Bir ara kendimi RAP söylemek zorunda hissettiren Microsoft şapkaları tüm aktivite boyunca en çok ilgi gören promosyonlardandı. Kapış kapış gitti :) o kadar ki şu an bende bile yok. Summer Hit'e gerçekten bir yaz havası veren bu şapkaların kendi içlerine katlanıp taşınabilir hale gelmeleri de ayrı bir özellik :)

Yemek veya yememek...
Yemek veya yememek...

İşte yemeklerimizden ufak bir görüntü. Beşiktaşa inerken yürümeyi tercih edip dönüşte aldığımız yük ile minibüslere binmeyi yeğledik. Sanırım tam tersi olması gerekiyordu :)

Gördüğünüz üzere epey eğlenceli bir hafta sonu geçirdik. Fotoğrafların orijinal boyutlarını ve daha burada bahsetmediğim tüm fotoğrafları aşağıdaki adresten inceleyebilir ve bilgisayarınıza indirebilirsiniz. 

http://cid-e780a156a6bd0e34.skydrive.live.com/browse.aspx/INETA%20Summer%20Hit%202008

Hepinize iyi haftalar...

Wednesday, August 06, 2008 11:37:52 AM (GTB Standard Time, UTC+02:00)  #    Comments [7]   Seminer  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.