Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - WCF
bir yazılımcının tasarıları...
 Sunday, December 27, 2009

Koca bir INETA NEXT serisi bitti! :) Bu hafta sonu gerçekleştirdiğimiz Denizli etkinliği ile beraber 2009'ın NEXT serisine son vermiş olduk. Diyarbakır, İstanbul, Kayseri ve Denizli turumuz INETA kapsamında tüm sosyal topluluklar ve editörleri ile beraber son iki yılda gerçekleştirdiğimiz en büyük hareket oldu. Tüm bu seri boyunca katkıda bulunan INETA sosyal topluluklarımıza ve sevgili konuşmacılarımıza ÇOK teşekkürler.

Muammer Benzeş (birliktegelistir.com)
Erkan Balaban (Ceviz.net)
Oğuz Yağmur (csharpnedir.com)
Uğur Umutluoğlu (nedirtv.com)
Barış Kanlıca (yazgelistir.com)
Burak Selim Şenyurt (nedirtv.com)
Selçuk Yavuz (Ceviz.net)

Tüm etkinlikler boyunca en çok merak edilenlerden birinin "Beyin" olduğunu gördüm :) Biliyorsunuz ilk etkinliği duyurduğumuzda her şehirde bir katılımcıya yeni bir beyin vereceğimizden bahsetmiştik. Bu beyin konusunda ben her ne kadar samimi olsam da :) herkes "beyin" kelimesinden yola çıkarak çok farklı şeyler düşünmüş. Oysa gerçekten de "beyin" derken "beyin" demek istemiştim :)

Yepyeni bir beynin sahibi!
Yepyeni bir beynin sahibi!

Fotoğrafta da görebileceğiniz üzere arkadaşımız yeni beynini sevinçle karşılamış durumda :D Her şehirde bu şekilde bir beyin hediye etme şansımız oldu. Beynin özelliği gerçek bir beyin "vıcıklığında" olma ile beraber her ne yaparsanız yapın esnese de şeklini kaybetmiyor olması :)

Etkinliklerimize katılan herkese tekrar defalarca çok teşekkürler. Bizi takip etmeye devam edin ;)

Sunday, December 27, 2009 10:23:48 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   .NET Framework 4.0 | ASP.NET 4.0 | C# | Expression Blend | Expression Studio | IE 8.0 | IIS 7.0 | LINQ | PLINQ | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | Windows 7 | WPF  | 
 Sunday, December 13, 2009

Bugün INETA NEXT'in İstanbul ayağını gerçekleştirdik. Kişisel olarak benim için efsanevi bir hafta sonu oldu! Tüm konuşmacılarımıza tek tek milyonlarca defa teşekkür ediyorum. Ayrıca tabi ki yağmura rağmen tüm salonu dolduran herkese de onlarca teşekkürler! Umarım herkes için de bir o kadar faydalı bir aktivite olmuştur.

Katılım zirvede bir seminer! INETA NEXT!
Katılım zirvede bir seminer! INETA NEXT!

İki gün boyunca hızlı bir "geleceğe bakış" attık. SL 4, VB10, CS4, ASP.NET 4, WF4, IIS Media Services, IE Development vs derken epey bir içeriğe hızlıca göz atma şansımız oldu. Tabi hediyelerimiz de eksik olmadı :) NEXT serisine uygun şekilde Windows 7 hediyemizin yanı sıra Windows 7 T-Shirtlerimiz, Visual Studio 2010 atkılarımız, laptop stickerlarımız! havalarda uçuştu desem yeridir :)

INETA NEXT İstanbul ayağı...
INETA NEXT İstanbul ayağı...

Tekrar katılan herkese defalarca teşekkürler. Çok yakında etkinlikte konuşan tüm konuşmacılarımızın sunumlarını ve video kayıtlarını da sizlerle www.inetatr.org üzerinden paylaşacağız. İçerikler ve paylaşımlar hazır olduğunda ben de twitter ve blog üzerinden duyuracağım.

Bu arada unutmayın :) blogumu sayfanın en üstündeki linkten kayıt olarak mail ile de takip edebilirsiniz.

Haftaya hafta sonu Kayseri'de görüşmek üzere!

Not: Tüm etkinlik fotoğraflarına buradan ulaşabilirsiniz: http://skydrive.live.com/inetanext09istanbul

Sunday, December 13, 2009 11:29:09 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   .NET Framework 4.0 | ASP.NET 4.0 | C# | IE 8.0 | Seminer | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | WF  | 
 Sunday, November 29, 2009

INETA NEXT etkinliklerimizle ilgili duyuruyu bundan yaklaşık bir hafta önce sizinle paylaşmıştım. Maalesef o zamanlarda içeriği paylaşma şansımız yoktu çünkü içeriğimizde daha Microsoft tarafından lansmanı yapılmamış ürünlere dair oturumlar olacaktı :) Eh artık zamanı geldi ve içeriğimizi paylaşmaktan gurur duyuyorum.

Diyarbakır - Dicle Üniversitesi, Tıp Fakültesi Konferans Salonu
5 Aralık
11.00-12.30 Visual Basic  10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Windows 7'de neler var? - Muammer Benzeş (birliktegelistir.com)
16.00-17.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
6 Aralık
11.00-12.30 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
14.00-15.30 WPF 4 ile 3D Animasyon Programlama - Daron Yöndem  (yazgelistir.com)
16.00-17.30 ASP.NET 4.0 - Erkan Balaban (ceviz.net)

İstanbul - Microsoft Ofisi (Kroki)
12 Aralık
;
10.00-11.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
11.00-12.00 ASP.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
14.00-15.00 IIS Media Services - Muammer Benzeş (birliktegelistir.com)
15.15-16.15 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
13 Aralık
11.00-12.30 ASP.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
14.30-15.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com)
16.00-17.00 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
17.15-18.00 IE 8 Toolbar Geliştirme  - Barış Kanlıca (yazgelistir.com)

Kayseri - Erciyes Üniversitesi Mühendislik Fakültesi Konferans Salonu
19 Aralık
11.00-12.30 C# 4.0 Yenilikleri -Burak Selim Şenyurt  (csharpnedir.com)
14.00-15.30 Silverlight 4 - Daron Yöndem (yazgelistir.com)
15.45-16.45 ASP.NET 4.0 - Selçuk Yavuz (ceviz.net)

20 Aralık
11.00-12.30 ASP.NET MVC 2 - Selçuk Yavuz (ceviz.net)
14.00-15.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
15.45-16.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com) 

Denizli - Pamukkale Üniversitesi Kongre Kültür Merkezi Ana Salon
26 Aralık
11.00-12.30 Silverlight 4.0 - Daron Yöndem (yazgelistir.com)
14.00-15.30 C# 4.0 Yenilikleri - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 Asp.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
27 Aralık
11.00-.12.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Asp.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 ASP.NET AJAX 4.0 - Uğur Umutluoğlu (nedirtv.com)

Kayıt için www.inetatr.org adresini ziyaret etmeyi unutmayın!

Bu arada ilk etkinlik duyurumuzda da yer alan "Bir katılımcıya yeni bir beyin verilecektir" :) cümlesi biraz merak uyandırmış. Zaten amacı da buydu söz konusu cümlenin. Merak etmeye devam etmeniz gerekecek fakat emin olun bir katılımcıya çekilişle yeni bir beyin vereceğiz :) Bizde yalan yok :) Ayrıca birçok da sürpriz hediye olacak, benden söylemesi.

Sunday, November 29, 2009 2:43:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   .NET Framework 4.0 | ASP.NET | ASP.NET 4.0 | C# | IIS 7.0 | Seminer | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | WF | Windows 7 | WPF  | 
 Monday, June 01, 2009

Dün bana gelen sorulardan birini cevaplamak üzerine hızlı bir makale yazmaya karar verdim :) Gelen soruya doğrudan girmeden önce senaryoya bir bakalım. Elimizde bir istemci var ve bu istemci sunucu üzerindeki web servislerini kullanıyor. Söz konusu web servisleri IIS üzerine yerleştirilmiş durumda. Oysa bizim istediğimiz şey bir anda bu web servislerini IIS'ten bağımsız hale getirmek. Örneğin bize ait başka bir sunucu uygulaması, özünde bir Windows uygulaması olsun ve söz konusu uygulama bu web servislerini sunmak ile sorumlu olsun. Ne dersiniz?

Nasıl olacak ki?

Web servislerine genel olarak IIS üzerinden sunulan sayfalar gözü ile bakarız oysa WCF ile bu manzara biraz değişiyor. WCF mantığında aslında web servisi diye birşey yok, sadece Servis var. Söz konusu servisi ister WEB ister başka bir şey üzerinden veya daha doğru bir tanımlama ile başka bir protokol ile yayınlayabilirsiniz. Yayınlanan protokolün mantığı vs aslında servisin iç yapısı ile alakasızdır! İşte WCF bunu sağlıyor. O nedenle ilk olarak varsa yazmış olduğumuz eski ASMX'leri birer WCF servisi haline dönüştürelim.

Bu dönüştürme işlemini yaparken projenize "Add New Item" diyerek yeni bir WCF servisi eklemelisiniz. Fakat projeniz ne projesi olacak? Yani eğer bu servisimizi bir web sitesi üzerinden sunmak istiyorsak tabi ki elimizde bir ASP.NET projesi olmalı ve o projeye WCF servisimizi eklemeliyiz. Oysa bizim istediğimiz şey bu Servis'in bir Windows uygulaması tarafından sunulması. O zaman ilk olarak elimizde bir Winforms veya WPF projesi bulunması gerekiyor, sonrasında bu projeye "Add New Item" diyerek bir Service ekleyebiliriz.

Projemizde servisimiz bizi bekliyor...
Projemizde servisimiz bizi bekliyor...

Yukarıda projemizin Servis eklenmiş halini görebilirsiniz. Projemize otomatik olarak bir Interface ve bir de Implentasyon kodları eklenmiş durumda. Eğer ASP.NET tarafında WCF servisleri kullandı iseniz bu noktada birşey dikkatinizi çekecektir. SVC uzantılı bir dosyamız yok! Çünkü ona ihtiyacımız yok :) Bu servis IIS tarafından sunulmayacak, bunu kendi programımız ile biz sunacağız o nedenle SVC gibi bir "placeholder" dosyaya ihtiyacımız yok.

Bu noktadan sonra WCF ile klasik web servisleri arasındaki farklardan en önemlisi bir Interface ve bir de Implementasyon dosyasının ayrı ayrı bulunuyor olması. Makalemizin amacı WCF anlatmak olmadığı için bu farkın detaylarına girmeyeceğiz fakat burada Interface'in servisin dışa sunduğu imzası olduğunu düşünebilirsiniz. Biz basit bir servis hazırlayarak devam edelim.

[VB]

Imports System.ServiceModel

 

<ServiceContract()> _

Public Interface IService1

 

    <OperationContract()> _

    Function Topla(ByVal x As Integer, ByVal y As Integer)

 

End Interface

[C#]

namespace WindowsFormsApplication1

{

    [ServiceContract]

    public interface IService1

    {

        [OperationContract]

        int Topla(int x, int y);

    }

}

Servisimiz şimdilik iki sayı alıp toplayacak. Yukarıda gördüğünüz Interface dosyası içerisinde servisin fonksiyonu ile ilgili bir implementasyon bulunmuyor. Sadece servisin uygulayacağı Intefrace'i yazdık. Sıra geldi şimdi de gerekli kodları yazacağımız diğer VB/C# dosyamıza geçmeye.

[VB]

Public Class Service1

    Implements IService1

 

    Public Function Topla(ByVal x As Integer, ByVal y As Integer) As Object Implements IService1.Topla

        Return x + y

    End Function

End Class

[C#]

namespace WindowsFormsApplication1

{

    public class Service1 : IService1

    {

        public int Topla(int x, int y)

        {

            return x + y;

        }

    }

}

Diğer dosyamızda artık çalışacak olan kodumuzu yazıyoruz. Burada gördüğünüz metodun ve kodun klasik web servislerinde yazdığınız koddan pek bir farkı yok. Genelde eski servislerinizden kodunuz alıp kopyala-yapıştır metodu ile WCF'e rahatlıkla taşıyabilirsiniz.

Artık WCF servisimiz hazırladığımız Winforms uygulaması içerisinde hazır olduğuna göre sıra geldi bu servisi nasıl başkalarına sunacağımza bakmaya. Bunun için hızlıca kullanabileceğimiz özel bir sınıf bulunuyor.

[VB]

Public Class Form1

 

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

        Dim ServisSunucu As New ServiceModel.ServiceHost(GetType(Service1))

        ServisSunucu.Open()

    End Sub

End Class

[C#]

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            System.ServiceModel.ServiceHost ServisSunucu = new System.ServiceModel.ServiceHost(typeof(Service1));

            ServisSunucu.Open();

        }

    }

}

ServiceHost nesnesi parametre olarak yaratacağı servisin tipini ister. Bizim daha önce yazdığımız servisin tipini kendisine iletmemiz ile beraber aslında bir servis sunucusu yaratmış oluyoruz. Söz konusu sunucuyu Open metodu ile başlatabilir veya Close metodu ile kapatabiliriz. Uygun şekilde bu komutları sunucuda çalışacak olan Winforms veya WPF uygulamamızda farklı düğmelere bağlayabilirsiniz.

Peki servisi başkaları nasıl kullanacak?

Servisi ekledik, çalıştırdık ama adresi nedir? Yani başkaları nasıl kullanacak? Daha önce de bahsettiğim gibi aslında bir WCF servisinin hangi Endpoint (çıkış noktası/adres) ile yayınlanacağı ve hangi protokol ile sunulacağı gibi ayarların yapılması gerekiyor. Yine maalesef ki bu ayarların detaylarına bu makalede inmeyeceğiz fakat biraz şanslıyız çünkü zaten varsayılan ayarları ile WCF servisleri wsHttpBinding kullanıyor. Yani HTTP üzerinden çıkıyorlar. Bizim de istediğimiz eski web servisleri gibi bu servislerin de HTTP üzerinden ulaşılabiliyor olmasıydı. Fakat çıkış noktası konusunda ufak bir ayar yapmamız şart.

Çıkış noktası veya servisimizin HTTP adresi ile ilgili ayar aslında uygulamanın içindeki App.config dosyasında saklanıyor. Bu dosya eğer Solution Explorer içerisinde gözükmüyorsa doğrudan "Show all files" düğmesine tıklayarak görünür hale getirebilirsiniz.

App.Config dosyası karşınızda.
App.Config dosyası karşınızda.

App.Config dosyasını açtığınızda farklı ayarlar ile karşılaşacaksınız. Bu ayarlar içerisinde bir adres dikkatinizi çekecektir.

[App.Config]

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="WindowsApplication1.Service1Behavior">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceDebug includeExceptionDetailInFaults="false" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="WindowsApplication1.Service1Behavior"

                name="WindowsApplication1.Service1">

                <endpoint address="" binding="wsHttpBinding" contract="WindowsApplication1.IService1">

                    <identity>

                        <dns value="localhost" />

                    </identity>

                </endpoint>

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8732/Design_Time_Addresses/WindowsApplication1/Service1/" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

Yukarıda gördüğünüz adresi değiştirmeniz halinde uygulamanız söz konusu adresi dinlemeye başlayacaktır. Tabi bu işlemi özellikle root adreslerde denerseniz uygulamanızın Admin hakları ile çalışmasına da dikkat etmeniz gerek. Örneğin aşağıdaki şekilde adresimizi değiştirelim ve sonrasında da bu adres üzerinden servisimizi başka bir uygulama ile kullanmayı deneyelim.

[App.Config]

<host>

  <baseAddresses>

    <add baseAddress="http://localhost/benimservisim" />

  </baseAddresses>

</host>

Basit bir şekilde bu uygulamayı admin hakları ile başlattıktan sonra yeni bir proje yaratarak "Add Service Reference" dediğinizde bu adresi girmeniz servise ulaşmanız için yeterli olacaktır. Unutmayın servisi host edecek uygulamanızın admin hakları ile başlamasının yanı sıra servisin ServiceHost üzerinden Open metodu ile çalıştırılmış olması da gerekiyor.

Normal bir servisi kullanmaktan farkı yok!
Normal bir servisi kullanmaktan farkı yok!

Gördüğünüz gibi yarattığımız başka bir projede rahatlıkla bir önceki uygulamamızda çalışan servisi referans olarak alabiliyoruz. Tabi bu referansa ait endpoint'i de kod ile set etmekte fayda var.

Bundan sonrası için servisinizi kullanırken normalden farklı bir mekanizma söz konusu değil. Her zamanki gibi servisinizi IIS üzerinden sunuluyormuş gibi kullanabilirsiniz. Hatta belki makalemizin devamında WCF'i biraz daha araştırarak bu servisin farklı Binding'ler ile nasıl sunulabileceğine de bakabilir ve birkaç saniye içerisinde aynı servisin hem HTTP hem de TCP üzerinden sunulmasını sağlayabilirsiniz.

Hepinize kolay gelsin.

Monday, June 01, 2009 3:47:48 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   WCF  | 
 Tuesday, March 31, 2009

Uzun bir aradan sonra tekrar güzel bir etkinlik ile karşınızdayız. Bundan yaklaşık iki ay önce sizlere erken duyurusunu yaptığım NEXT HIT etkinliğimizin programını duyurmanın zamanı geldi!

11 Nisan

09.30-10.00    Açılış
10.00-10.45    Windows 7 Deep-Dive  - Mehmet Nuri Çankaya
11.00-13.00    Silverlight 3.0 - Daron Yöndem
14.00-15.30    Bulut Bilişimi ve Azure - Panel
16.00-17.00    PHP On Windows ve Hyper-V - Muammer Benzeş

12 Nisan

10.00-12.00    Sürpriz Oturum - Daron Yöndem
13.00-15.00    ASP.NET 4.0 - Uğur Umutluoğlu
15.15-17.00    WCF 4.0 ve WF 4.0 - Burak Selim Şenyurt

Programımız epey yoğun ve muhteşem yenilikler var. Konularımızın hepsi taze. Eminim ki hemen akıllarda "Süpriz Oturum nedir?" sorusu belirecek. Süpriz oturumumuzu şu anda açıklayamıyoruz. Süprizimizi ancak 11 Nisan günü açıklayabileceğiz.

Katılım için ne yapmam gerek?

Aktivitemiz Yıldız Teknik Üniversitesi, Beşiktaş Kampüsü Oditoryumu'nda gerçekleşecek. Katılım için inetatr.org adresinden kayıt yaptırmanız yeterli. Bir önceki Professional Hit'te olduğu gibi yer sıkıntımız yok, veya size tekrar kayıt olmanız için ikinci mailler atmayacağız. Bu konuda geçen sefer yaşanan sıkıntıları çok net biliyorum ve bu neden özellikle üzerinde durarak bu sıkıntıların tekrar yaşanmayacağı konusunda emin olmanızı istiyorum.

Hepinize 11-12 Nisan'da görüşmek üzere! Unutmadan, güzel hediyelerimiz var :) bu sefer "su" sıkıntımız da yok :)

Dipnot!

Bu aktivite için blogumu okuyan herkesten duyuru anlamında yardım rica ediyorum. "Haberimiz yoktu" diyerek aktivite sonrası mail atan çok kişi oluyor. O nedenle elinizden geldiğince duyuru konusunda yardımcı olabilirseniz herkesin rahatlıkla faydalanmasını sağlayabiliriz. Şimdiden hepinize çok teşekkürler.

Tuesday, March 31, 2009 12:14:45 AM (GTB Standard Time, UTC+02:00)  #    Comments [7]   Silverlight 3.0 | WCF | WF | Windows 7 | WPF | ASP.NET 4.0  | 
 Sunday, February 22, 2009

Son iki gündür sevgili Uğur Umutluoğlu ile Ankara, Bilkent Üniversitesi'ndeyiz. Toplam iki gün süren ve 6 oturumdan oluşan bir seri ile birçok konuya değindik. WPF, WCF, LINQ, C# 3.0, Silverlight, ASP.NET 3.5 SP1 başlıklarına sahip oturumların hepsinde de muhteşem ilgili bir kitle bulunduğunu itiraf etmeliyiz.

Bilkent Üniversitesi, Ankara, Silverlight Oturumum
Bilkent Üniversitesi, Ankara, Silverlight Oturumum

Oturumlarımızdan birini de LAB çalışması olarak gerçekleştirdik ve Silverlight seminerinde öğrendiklerimizi Silverlight ile bir oyun geliştirerek pekiştirdik. LAB çalışması benim neredeyse etkinlik içerisinde en sevdiğim bölüm oldu. "Üretmenin" zevkini herkesin gözlerinde gördüm.

Silverlight Lab Çalışması
Silverlight Lab Çalışması

Buradan teşekkür etmem gereken o kadar çok kişi var ki :) Sevgili MSP'lerimiz Ali Uğur Çakmak, Alper Özçetin'a çok teşekkürler. Ayrıca BTS ve ACM'deki herkese teşekkürler. Süper bir hafta sonu geçirdim, "dayının yeri"ni hala unutamıyorum :)

Sunday, February 22, 2009 10:29:12 PM (GTB Standard Time, UTC+02:00)  #    Comments [6]   ASP.NET 3.5 | LINQ | Silverlight 2.0 | WCF | WPF  | 
 Wednesday, January 28, 2009

Bu hafta sonu INETA Professional Hit etkinliğimizi gerçekleştirdik. Kayıt alımındaki sorunlara karşın etkinlik boyunca gelen olumlu tepkiler epeyce moralimi düzeltti. Level 300 hedefi ile yola çıksak da maalesef beni dinlemeyip :) oturumlardaki konularla ilgili hiç çalışmamış arkadaşlar da geldi! Umarım bir sonraki Level 300 etkinliğimizin seviyesi ile ilgili biraz da olsa fikir oluşmuştur kafalarda. Özellikle benim Silverlight oturumunda salonun yarısının hiç Silverlight ile ilgilenmemiş olması Level 300 seviyelerine çıkmamızı engelledi diyebilirim.

INETA Professional Hit İlk Gün
INETA Professional Hit İlk Gün

Neyse :) Bu her açıdan bir "ilk"ti ve hepimiz Level 300 seminerlerle ilgili bir şeyler öğrendik. Bir dahakinin daha verimli olması için bazı notlar da aldık kenara. Şimdi sıra geldi artık fotoğrafları :) ve örnek kodlar ile sunumları sizlerle paylaşmaya.

http://cid-8eca4439fd9a640f.skydrive.live.com/browse.aspx/INETA%20Professional%20Hit%20012009

Yukarıdaki adresten tüm fotoğrafları orijinal çözünürlükleri ile indirebilirsiniz. Ayrıca yukarıdaki adreste bir de Ozel.rar dosyası göreceksiniz :) O dosya içerisinden de kişisel çekilmiş fotoğraflar var.

INETA Professional Hit 2. Gün
INETA Professional Hit 2. Gün

Son olarak aşağıdaki download linklerinden de her oturumla ilgili örnekleri ve sunumları indirebilirsiniz.

28012009_ADONET.rar (1,13 MB)
28012009_AJAX.rar (75 KB)
28012009_CSHARP.rar (551,66 KB)
28012009_LifeCycle.rar (126,8 KB)
28012009_Silverlight.rar (672,98 KB)

Katılan herkese çok teşekkürler. Bir başka aktivitede görüşmek üzere ;)

Wednesday, January 28, 2009 1:45:36 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   ADO.NET Data Services | AJAX | ASP.NET 3.5 | Silverlight 2.0 | WCF  | 
 Monday, December 01, 2008

Son üç gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim. Cumartesi günü başladığımız INETA Boot Camp Isparta etkinliğimizde LINQ ve WCF konularını işledik. Pazar günü Microsoft'un Oyun Turu'nun da Isparta ayağını kampımıza ekleyerek dün de bahsettiğim gibi SL 2.0 ile ve XNA ile Oyun Programlama konularını inceledik. Son günümüz olan Pazartesi günü de ASP.NET Dynamic Data Web Site yapılarını göz attık sonra "Silverlight 2.0 ile Data Uygulamaları" ve "WPF" oturumlarımızı tamamladık. Böylece dolu dolu bir üç gün geçirdik.

Isparta, Süleyman Demirel Üniversitesi, INETA Boot Camp
Isparta, Süleyman Demirel Üniversitesi, INETA Boot Camp

Etkinliklere katılan hem konuşmacı arkadaşlarıma hem de sevgili öğrenci kardeşlerime çok teşekkür ediyorum. Geçen öğretim yılında da Süleyman Demirel Üniversitesi'nde gittiğimde blogumda yazmıştım hatta dün de yazmışım :) SDÜ'nün yeri benim için çok ayrı. Yukarıda resimde gördüğünüz tüm öğrencilerin Silverlight ve WPF konulu ödevleri var. Hepsi giriş seviyesini çoktan geçmiş durumda. Bu duruma tabi ki öğretim görevlilerinin katkısı çok büyük.

Özellikle organizasyonun gerçekleşmesindeki katkılarından dolayı sevgili Eğitim Görevlisi dostum Mehmet Albayrak'a çok teşekkür ediyorum.

Son gün yaptığımız bazı örnekleri toparlayıp bir poşete koydum :) aşağıdaki linkten indirebilirsiniz.

Örneklere ait kaynak dosyalar - 01122008_2.rar (2,81 MB)

Monday, December 01, 2008 2:57:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   ASP.NET 3.5 | Expression Blend | LINQ | Silverlight 2.0 | WCF | WPF  | 
 Monday, October 20, 2008

Hafta sonunu Ankara'da geçirdik. Neden mi? INETA Capital Hit zamanıydı! Atladık INETA minibüsümüze :) yollara düştük. Maceralarımızla ilgili videolar ve fotoğraflar çok yakında bu blogda :)

İki kocaman gün boyunca dopdolu bir programla Çankaya Üniversitesi'nde iki yüz elli kişilik bir ekip olarak yattık kalktık diyebilirim. Yine her zamanki gibi benim için muhteşem zevkliydi.

Pazar akşamı saat yedide Capital Hit'i sonlandırdık.
Pazar akşamı saat yedide Capital Hit'i sonlandırdık.

Aktiviteye katılan tüm konuşmacı dostlarıma binlerce teşekkür. Ayrıca Çankaya Üniversitesi Bilişim Kulübü ve sevgili MSP, Çağrı Erdoğan'a da çok teşekkürler. Bir organizasyonda ancak bu kadar başarılı bir misafirperverlik sergilenebilirdi.

Tabi ki her şey bu kadarla bitmiyor! Elimde birçok fotoğraf, minibüs yolculuğumuzdan videolar ve panel kaydımız var. Hepsini büyük bir hızla hazırlamaya çalışıyorum. En kısa zamanda sizlerle buradan paylaşacağım.

Şimdilik aşağıdaki sunumlarla idare edelim :)

AdoNet Data Services / Burak Selim Şenyurt - 20102008_1.pptx (1,01 MB)
LINQ / Uğur Umutluoğlu - 20102008_2.pptx (750,29 KB)
WCF / Burak Selim Şenyurt - 20102008_3.pptx (460,14 KB)

Not: Bu sefer ben hiç sunum kullanmadım, doğrudan demolarla ilerledim. O nedenle sunum paylaşamıyorum.

Monday, October 20, 2008 6:24:54 PM (GTB Standard Time, UTC+02:00)  #    Comments [9]   .NET Framework 3.5 | ASP.NET 3.5 | Expression Blend | Haberler | IIS 7.0 | LINQ | Seminer | Silverlight 2.0 | WCF | WPF  | 
 Friday, September 26, 2008

INETA Summer Hit üzerinden uzun bir zaman geçti gibi hissettiğimiz bu günlerde yeni bir aktivite serisi ile tekrar karşınızdayız. Bu sefer İstanbul değil Anadolu'nun merkezi, Başkentimiz Ankara'da olacağız.

INETA Capital Hit Afişi

Dikkat ederseniz İstanbul'daki Summer Hit sonrası içeriğimizi de epeyce değiştirdik. Tabi bunda sizlerin doldurmuş olduğu değerlendirme formlarının etkisi çok büyük. Bu sefer çok daha sıkışık ve yoğun bir tempomuz olacak. Hediyelerimiz daha fazla (hatta çok ilginç beklenmedik şeyler var :)) ve içecek sorununu da hallettik (:))

İlk gün sabah yine SL 2.0 ile başlayıp sonra benim çok önem verdiğim IIS 7'ye geçeceğiz. IIS 7.0 üzerinde ASP.NET ve PHP tarafında çok güzel yenilikler var. Sonrasında her zamanki gibi bir sohbet panelimiz olacak. Son olarak LINQ ile ilk günümüzü kapatacağız. İkinci gün WPF ile başlayarak ADO.NET Data Services konusunu inceleyeceğiz. Heyecanlandığınızın farkındayım :) Sonrasında IE 8.0 ile gelen yazılımcı ve tasarımcıları ilgilendiren yenilikler ve yeni uygulama platformlarını inceleyerek WCF dünyasına da atılarak iki günü sonlandıracağız.

Aktiviteye üniversite girişinde güvenlik sorunları yaşamamak adına kayıt olmanız şart.

Kayıt adresi: http://daron.yondem.com/kayit/

Emeklerinden dolayı buradan sevgili MSP, Çağrı Erdoğan'a çok teşekkür ediyorum.

Aktiviteyi duyururken geçen sefer güzel bir başarı elde etmiştik. Bu sefer de yine aşağıdaki bannerı kullanabilirsiniz. Banner'a tıklandığında link olarak da kayıt adresini verebilirsiniz.

INETA Capital Hit Banner

Hepinizi bekliyorum ;)

Friday, September 26, 2008 8:59:59 AM (GTB Standard Time, UTC+02:00)  #    Comments [23]   .NET Framework 3.5 | ASP.NET 3.5 | Expression Blend | IIS 7.0 | LINQ | Seminer | Silverlight 2.0 | Visual Basic 2008 | Visual Studio 2008 | WCF | WPF  | 
 Tuesday, September 23, 2008

Başlık olarak “Reflection” yazdıktan sonra ardına sayfalarca açıklama ve örnek konulabilir. Hatta bu konuda ayrı bir kitap bile yazılabilir. Reflection’ın çok farklı kullanımlar var. Özetleyerek hızlı bir şekilde tanımlamak istersek aslında Reflection bize hakkında bilgi sahibi olmadığınız programatik nesnelerle ilgili çalışma zamanında (run-time) bilgi alabilmemize olanak tanıyan bir metottur. Peki böyle bir şeye neden ihtiyacımız olsun? En basit örnek gerçek zamanlı olarak uygulamalara farklı DLL dosyalarının bağlandığı durumları gösterebiliriz. Böyle bir durumda kaynak konumdaki sınıflar veya metotlar ile ilgili herhangi bir bilgi bulunmaz. Söz konusu bu bilgilerin program çalışırken elde edilerek kullanılması gerekir. Gelin ilk olarak Reflection’ın yapısını ve sistemini tanımak adına tek bir uygulama içerisinde nasıl kullanılabileceğimize göz atalım. Örnek uygulamamızda aşağıdaki şekli ile tanımlanmış bir Urun sınıfı kullanacağız.

[VB]

Public Class Urun

 

    Private PAdi As String

    Public Property Adi() As String

        Get

            Return PAdi

        End Get

        Set(ByVal value As String)

            PAdi = value

        End Set

    End Property

 

    Sub New()

 

    End Sub

 

    Sub New(ByVal adi As String)

        Me.Adi = adi

    End Sub

 

    Function Uyari() As String

        Return "Ürünün adı: " & Me.Adi

    End Function

End Class

[C#]

public class Urun

{

 

    private string PAdi;

    public string Adi

    {

        get { return PAdi; }

        set { PAdi = value; }

    }

 

    public Urun()

    {

 

    }

 

    public Urun(string adi)

    {

        this.Adi = adi;

    }

 

    public string Uyari()

    {

        return "Ürünün adı: " + this.Adi;

    }

}

Uygulamamız içerisinde iki adet düğme yer alacak ve kullanacağımız Windows penceresinde global olarak tanımlanmış bir de Object tipinde değişkenimiz bulunacak.

[VB]

Dim BirUrun As Object   

[C#]

object BirUrun;

Uygulama içerisindeki düğmelerden birine basıldığında global BirUrun değişkenimiz yeni bir Urun değişkenine dönüştürülecek.

[VB]

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

    BirUrun = New Urun

End Sub

[C#]

    private void button1_Click_1(object sender, EventArgs e)

    {

        BirUrun = new Urun();

    }

Programımız içerisinde diğer düğmeye basıldığında BirUrun adındaki değişkenimizin Adi özelliğini değiştirerek Uyari adındaki metodunu kullanmak istiyoruz. Fakat Visual Studio içerisinde maalesef ki BirUrun adındaki değişkenle beraber Urun tipine ait Intellisense desteği gelmeyecektir. Aslında bu durumun haklı bir nedeni var. İkinci düğmeye basıldığında BirUrun adındaki değişkenin tipininin Object mi yoksa Urun mü olacağı belli değil. İşte tam da istediğimiz ortamı yaratmış olduk. Kullanacağımız nesnenin tipi belirsiz ve biz ona ait bazı özellikleri kullanmak istiyoruz. Bu durumda ilk olarak ikinci düğmeye basıldığında gerçekten BirUrun değişkeninin tipi Urun mü yoksa değil mi sorusunu kontrol etmemiz lazım.

[VB]

       If TypeOf (BirUrun) Is Urun Then

 

        End If

[C#]

        if ((BirUrun) is Urun)

        {

 

        }

Buraya kadar her şey çok kolay. Bundan sonra eğer IF kontrollerimize olumlu sonuç dönüyorsa ilk olarak gidip nesnenin Adi özelliğini bulmamız ve ona bir değer aktarmamız gerekiyor.

[VB]

BirUrun.GetType.GetProperty("Adi").SetValue(BirUrun, "Daron", Nothing)

[C#]

BirUrun.GetType().GetProperty("Adi").SetValue(BirUrun, "Daron", null);   

Yukarıdaki kod ile elimizdeki nesnenin tipini bilmeden onun Adi adındaki özelliğini (property) yakalayarak değerini Daron olarak değiştiriyoruz. Kodumuzu detaylı olarak adım adım bakacak olursak ilk aşamada nesnenin tipini GetType ile alıyoruz. Sonrasında ise tipini yakaladığımız nesnenin GetProperty ile Adi adındaki özelliğini alarak SetValue ile söz konusu özelliğin değerini değiştiriyoruz. SetValue metodu toplam üç parametre alıyor; bunlardan ilki değer değişikliği yapılacak nesnenin kendisi, ikincisi yeni atanacak olan değer, üçüncüsü ise eğer değiştirilecek olan özellik (property) indeksli ise söz konusu indeks değeri. Bizim örneğimizde indeksli bir özellik olmadığı için bu parametreyi boş geçiyoruz.

Değer atamamızı tamamladığımıza göre bu sefer de sıra geldi BirUrun değişkenimize ait Uyari metodunu çalıştırmaya. Metodumuz bize bir String döndürecek biz de onu doğrudan bir mesaj kutusu ile kullanıcıya göstereceğiz.

[VB]

BirUrun.GetType.InvokeMember("Uyari", Reflection.BindingFlags.InvokeMethod, Nothing, BirUrun, Nothing)

[C#]

BirUrun.GetType().InvokeMember("Uyari", System.Reflection.BindingFlags.InvokeMethod, null, BirUrun, null).ToString();

Reflection kullanarak türü bilinmeyen bir nesnenin bir metodunu çalıştırmak için InvokeMember metodundan faydalanmamız gerekiyor. InvokeMember aslında çok geniş kullanımı olan bir metod, biz şimdilik sadece bir çeşit kullanımına değineceğiz. Örneğimizde InvokeMember bir metod çalıştıracağı için ilk parametresinde çalıştırılacak olan metodun adını ikincisinde BindingFlags.InvokeMethod ile bir Metod çalıştırılacağını belirtiyoruz. Üçüncü parametre bizim şimdilik kullanım alanımız dışında kalan Binding’lerle ilgili, aynı şekilde beşinci parametre de boş bırakılarak geçilecek. Dördüncü parametrede ise hedef nesnemiz olan BirUrun değişkenimizi atayacağız. Böylece metodumuzu da çalıştırmış olduk.

Dinamik DLL Kullanımı

Kabaca Reflection’ın nasıl kullanılabildiğine dair bir örnek yaptıktan sonra artık sıra geldi harici bir DLL dosyasının çalışma anında programımıza ekleyerek içerisindeki yapıları kullanmaya. Bu çeşit bir işlevselliği özellikle gerçek zamanlı DLL derlemesi ile birleştirdiğinizde çok farklı bir dünyaya kapı açmış olacaksınız. Hedef olarak kullanacağımız DLL dosyasını aşağıdaki kodlardan yaratacağız.

[VB]

Public Class Deneme

    Function Metin() As String

        Return "Çalışıyor"

    End Function

End Class

[C#]

    public class Deneme

    {

        string Metin()

        {

            return "Çalışıyor";

        }

Yarattığımız DLL dosyasını uygulamamız ile aynı konuma yerleştirdikten sonra aşağıdaki kod ile DLL’imizi kullanmaya başlayabiliyoruz.

[VB]

Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

[C#]

System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

Artık yukarıda tanımladığımız Assembly üzerinden Reflection kullanarak ilerleyebiliriz. İlk olarak Deneme adında sınıfımızdan bir instance almamız gerekecek. Bunun için Deneme tipini bulmamız lazım.

[VB / C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme")

Assembly üzerinden modülümüzü yakalıyor sonra da Deneme adındaki tipinizi buluyoruz. Tabi tipi bulmak yeterli değil, söz konusu tipte bir değişken yaratmamız gerekiyor. Activator sınıfını kullanarak bu tip üzerinden bir instance yaratarak Sinif adında bir değişkene aktaracağız.

[VB]

Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))   

[C#]

object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

Yarattığımız sınıfın maalesef özellikleri otomatik olarak gelmeyecek. O nedenle Metin adındaki metodumuzu da elle bularak çalıştırmak zorundayız.

[VB]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing)

[C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null)

Yine Assembly üzerinden yola çıkarak bu sefer daha da ileri gidiyoruz. Deneme sınıfımızı bulduktan sonra içerisinde Metin adındaki metodumuzu buluyor ve doğrudan Invoke ile söz konusu metodu çalıştırıyoruz. Invoke metodu bizden iki parametre istiyor; bunlardan ilki ana sınıfın kendisi. Bir önceki adımda yakaladığımız sınıfı buraya parametre olarak aktarıyoruz. Diğeri ise bizim kullanmayacağımız Binding parametresi.

Metin metodumuz çalıştırıldığında geriye bir String değişkeni döndürüyor. Bu değişkeni de bir mesaj kutusu ile kullanıcıya göstermek istersek uygulamamızın tam kodunun aşağıdaki şekilde sonlanması gerekiyor.

[VB]

Public Class Form2

 

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

        Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

 

        Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))

        MsgBox(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing))

    End Sub

End Class

[C#]

namespace CSReflection

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

 

            object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

            MessageBox.Show(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null).ToString());

        }

    }

}

Böylece harici bir DLL dosyasını yükleyerek istediğimiz metodu dinamik olarak kullanabildik. Farklı durumlarda isterseniz bir DLL içerisinde tüm metod, sınıf ve özelliklerin listelerini alabilir hatta bunları LINQ sorguları ile tarayabilirsiniz.

[VB]

Dim Metodlar = From Gelenler In BirAssembly.GetModule("Ornek2.dll").GetTypes Where Gelenler.GetMethod("Metin") IsNot Nothing

[C#]

var Metodlar = from Gelenler in BirAssembly.GetModule("Ornek2.dll").GetTypes() where Gelenler.GetMethod("Metin") != null select Gelenler;

Örneğin yukarıdaki LINQ sorgumuz ile harici DLL dosyası içerisinde Metin adında metodu olan tüm sınıfların bir listesini alıyoruz.

Hepinize kolay gelsin.

Tuesday, September 23, 2008 6:51:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [8]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET | ASP.NET 3.5 | LINQ | Silverlight 2.0 | Visual Basic 2005 | Visual Basic 2008 | Visual Studio 2005 | Visual Studio 2008 | WCF | WF | WPF  | 
 Sunday, September 21, 2008

Bir uygulama düşünün kendini programlayabilen. Konumuz “Star Trek” veya “Geleceğe Dönüş” değil. Emin olun gerçek dünyadan ve yapılabileceklerden bahsediyorum. Uygulamalarınızın dış sistemlerle ciddi bir bağlantı içerisinde olduğu durumlarda bazen kendi içlerinde dış sistemlere uygun kodlar üreterek kullanmaları gerekebilir. Bunu bazen uygulamaların kendi içlerindeki yapay zeka ile yapabilecekleri gibi bazen ise başka bir dış kaynaktan aldıkları yeni parametrelerden yola çıkarak kendi kodlarında değişiklik yapabilirler. Eğer bunların hiçbiri size gerçekçi gelmiyorsa başka bir seçenek olarak da harici uygulamaların kullanabileceği DLL dosyaları yaratacak bir uygulama yazmak istediğinizde yapmanız gerekenlerden bahsedebiliriz. Aslında her ikisi de aynı kapıya çıkıyor.

Bize dinamik olarak uygulamalar tarafından kullanılabilecek DLL dosyaları yaratacak bir kod lazım. Kullanacağımız nesnelerin çoğunun bulunduğu esas namespace System.CodeDom.Compiler olacak. Bunun haricinde C# veya VB için ayrı ayrı uygun namespace’leri kullanmamız gerek. Eğer VB kodu derleyecekseniz VB sınıflarını C# kodu derleyecekseniz tabi ki C# sınıflarını kullanmalısınız. Çapraz işlem yaparak C# kodunuz ile VB kodundan DLL üretme şansınız da var. Biz örneklerimizde C# ile C#’dan derleme, VB kodu ile de VB’den derleme yapacağız.

[VB]

Dim KodUretici As New Microsoft.VisualBasic.VBCodeProvider

Dim Derleyici As System.CodeDom.Compiler.CodeCompiler = KodUretici.CreateCompiler()

 

Dim Referanslarim As String() = {"System.dll"}

Dim AssemblyAdi As String = "Ornek.dll"

[C#]

Microsoft.CSharp.CSharpCodeProvider KodUretici = new Microsoft.CSharp.CSharpCodeProvider();

System.CodeDom.Compiler.ICodeCompiler Derleyici = KodUretici.CreateCompiler();

 

String[] Referanslarim =  {"System.dll"};

String AssemblyAdi= "Ornek.dll";

Kodumuzun başlangıcında ilk olarak birer CodeProvider nesnesi yaratıyoruz. Elimizdeki hazır kodu derleyecek olan nesneler olarak bu sınıflar VB ve C# için farklılaşıyor. CodeProvider’lar üzerinden birer de derleyici nesnesi aldıktan sonra sıra geliyor derleyeceğimiz kodun referanslarına karar vermeye. Referansları DLL isimleri ile bir String dizisine aktarmanız şart. Windows uygulamalarında en azından System.dll’in web uygulamalarında da System.Web.dll’in referans alınmış olması gerekiyor. Son olarak üreteceğimiz DLL dosyasının adını da başka bir değişkene aktararak yolumuza devam edelim.

[VB]

Dim DerlemeParametreleri As New System.CodeDom.Compiler.CompilerParameters(Referanslarim, AssemblyAdi)

DerlemeParametreleri.GenerateExecutable = True

DerlemeParametreleri.GenerateInMemory = False

[C#]

System.CodeDom.Compiler.CompilerParameters DerlemeParametreleri = new System.CodeDom.Compiler.CompilerParameters(Referanslarim, AssemblyAdi);

DerlemeParametreleri.GenerateExecutable = false;

 DerlemeParametreleri.GenerateInMemory = false;

Derleme işlemini yaparken yapmamız gereken ayarlar var. Bu ayarları derleyicimize bir CompilerParameters nesnesi olarak aktaracağız. DerlemeParametreleri değişkenimizi yaratırken referanslarımızı ve DLL adını aktardıktan sonra özel olarak GenerateExecutable özelliğini false olarak ayarlıyoruz. Böylece derleyicimiz bize tek başına çalışabilir bir dosya yaratmaktansa bir DLL dosyası yaratacak. Bir sonraki adımda da GenerateInMemory özelliğini false yaparak yaratılacak dosyanın uygulamamız ile aynı konuma, diske yazdırılmasını sağlıyoruz. Aksi halde yaratılan Assembly sadece hafızada tutulacak ve diske yazılmayacaktır. Sıra geldi dinamik olarak derlemeyeceğimiz kodu bir değişkene aktarmaya.

[VB]

Dim Kodum As String = <Kod>Public Class Deneme

    Function Metin() As String

        Return "Çalışıyor"

    End Function

End Class</Kod>.Value

[C#]

System.IO.StreamReader Okuyucu = new System.IO.StreamReader("Class1.cs");

string Kodum = Okuyucu.ReadToEnd();

Okuyucu.Close();

Bu noktada VB ile C# arasında farklı işlemler yaptım. VB’de doğrudan yaratacağım kodu uygulamanın içerisine gömerken C#’da derleyeceğim C# kodunu harici bir Class1.cs dosyasından çektim. Siz kendi uygulamalarınızda ister bu kodları farklı dosyalardan çekin ister metin işlemleri ile dinamik kod yaratın. İhtiyaçlarınıza göre uygun çözümü üretmek tamamen size kalmış. Önemli olan tek nokta aslında bu kodlarda hiçbir hatanın olmaması gerektiği, aksi halde derleme işlemi yapılamayacaktır.

[VB]

Dim Sonuc As System.CodeDom.Compiler.CompilerResults = KodUretici.CompileAssemblyFromSource(DerlemeParametreleri, Kodum)

[C#]

System.CodeDom.Compiler.CompilerResults Sonuc = KodUretici.CompileAssemblyFromSource(DerlemeParametreleri, Kodum);

Tüm ayarlarımız tamamlandığında göre doğrudan CodeProvider nesnemizin CompileAssemblyFromSource metodunu kullanarak derleme işlemini başlatabiliriz. Tabi bu esnada daha önce hazırlamış olduğumuz DerlemeParametrelerini de metoda parametre olarak aktarıyoruz. Derleme işlemimizi baştan sona tamamlayan kodumuzu bir bütün olarak inceleyelim.

[VB]

Dim KodUretici As New Microsoft.VisualBasic.VBCodeProvider

Dim Derleyici As System.CodeDom.Compiler.CodeCompiler = KodUretici.CreateCompiler()

 

Dim Referanslarim As String() = {"System.dll"}

Dim AssemblyAdi As String = "Ornek.dll"

 

Dim DerlemeParametreleri As New System.CodeDom.Compiler.CompilerParameters(Referanslarim, AssemblyAdi)

        DerlemeParametreleri.GenerateExecutable = True

        DerlemeParametreleri.GenerateInMemory = False

 

Dim Kodum As String = <Kod>Public Class Deneme

    Function Metin() As String

        Return "Çalışıyor"

    End Function

End Class</Kod>.Value

 

Dim Sonuc As System.CodeDom.Compiler.CompilerResults = KodUretici.CompileAssemblyFromSource(DerlemeParametreleri, Kodum)

[C#]

Microsoft.CSharp.CSharpCodeProvider KodUretici = new Microsoft.CSharp.CSharpCodeProvider();

System.CodeDom.Compiler.ICodeCompiler Derleyici = KodUretici.CreateCompiler();

 

String[] Referanslarim =  {"System.dll"};

String AssemblyAdi= "Ornek.dll";

 

System.CodeDom.Compiler.CompilerParameters DerlemeParametreleri = new System.CodeDom.Compiler.CompilerParameters(Referanslarim, AssemblyAdi);

DerlemeParametreleri.GenerateExecutable = false;

DerlemeParametreleri.GenerateInMemory = false;

 

System.IO.StreamReader Okuyucu = new System.IO.StreamReader("Class1.cs");

string Kodum = Okuyucu.ReadToEnd();

Okuyucu.Close();

 

System.CodeDom.Compiler.CompilerResults Sonuc = KodUretici.CompileAssemblyFromSource(DerlemeParametreleri, Kodum);

Dinamik olarak DLL dosyası derlemek işte bu kadar kolay. Dinamik kod yaratma araçları son dönemde çok popüler. Veritabanına bağlanarak veritabanındaki nesneleri algılayıp uygun “Veri Katmanı” kodunu dinamik olarak oluşturan hazır uygulamalar olduğu gibi bazı durumlarda özel kodlar yazmak da gerekebiliyor. Böyle bir durumda artık siz de uygulamalarınıza farklı kaynaklardaki şartlara uygun kodu dinamik olarak üretebilir ve bir DLL olarak farklı uygulamalara aktarabileceğiniz gibi kendi uygulamalarınızda da kullanabilirsiniz. Yarattığınız DLL dosyasını hemen uygulamanızda kullanmak isterseniz bu sefer dinamik olarak Assembly kullanımını ve Reflection konusuna eğilmenizde fayda var.

Hepinize kolay gelsin.

Sunday, September 21, 2008 7:04:21 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET | ASP.NET 3.5 | Silverlight 2.0 | Visual Basic 2005 | Visual Basic 2008 | Visual Studio 2005 | Visual Studio 2008 | WCF | WPF  | 
 Thursday, April 24, 2008

.NET Framework 3.0 ile beraber karşımıza çıkan WCF servisleri aslında çoktan klasik web servislerinin yerini de almış durumda. Tabi ki doğrudan bir karşılaştırma yapmak çok yanlış olacaktır, WCF çok daha geniş kapsamlı bir çerçevede değerlendirilmeli. Silverlight 2.0 tarafına baktığımızda ise istemci ile sunucu arasındaki veri trafiğini klasik ASMX web servislerine bağlayabileceğimiz gibi istersek doğrudan WCF servislerini de kullanabiliyoruz. Bu yazıda Silverlight 2.0 Beta 1 ile WCF servislerininin kullanımına değineceğiz.

WCF servisimizi hazırlayalım.

Visual Studio 2008 içerisinde yarattığımız yeni Silverlight projemize eşlik eden Web Project içerisinde yeni bir WCF servisi yaratıyoruz. Örneğimizde Silverlight tarafından gönderilen iki sayıfa WCF servisi tarafından alınarak sunucu tarafından toplanacak ve geri döndürülecek. Bu çerçevede uygun bir WCF servisini hazırlarken aşağıdaki kodları yazmamız gerekiyor.

[IService.vb]

Imports System.ServiceModel

 

<ServiceContract()> _

Public Interface IService

 

    <OperationContract()> _

    Function Toplama(ByVal x As Integer, ByVal y As Integer) As Integer

 

End Interface

[Service.vb]

Public Class Service

    Implements IService

 

    Public Function Toplama(ByVal x As Integer, ByVal y As Integer) As Integer Implements IService.Toplama

        Return x + y

    End Function

 

End Class

WCF servisimiz hazır olduğuna göre Silverlight tarafına geçiş yapabiliriz diye düşünüyorsunuz kesinlikle aldanıyorsunuz. Varsayılan ayarları ile Visual Studio içerisinde herhangi bir WCF servisi yarattılığında wsHttpBinding kullanılır oysa bizim Silverlight tarafında basicHttpBinding'e ihtiyacımız var. O nedenle hemen projemizin Web.Config dosyasına ufak bir yolculuk yaparak aşağıdaki şekilde ayarlarda değişiklik yapmamız gerekiyor.

<services>

  <service behaviorConfiguration="ServiceBehavior" name="Service">

    <endpoint address="" binding="basicHttpBinding" contract="IService">

      <identity>

        <dns value="localhost" />

      </identity>

    </endpoint>

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

  </service>

</services>

Artık tüm ayarlarımız tamamladı. Silverlight 2.0 tarafına rahatlıkla geçebiliriz.

Silverlight 2.0 ve WCF bağlantısı

WCF servisimiz ile Silverlight uygulamamızın aynı domain içerisinde olması şart. Güvenlik kuralları nedeniyle "cross-domain" yani alan adları arası veri trafiği oluşturma şansımız yok. Visual Studio içerisinde Silverlight projenize sağ tıklayarak gelen menüden "Add Service Reference" düğmesine basarak proje içerisinde WCF servisini Silverlight uygulamasına referans olarak ekleyebilirsiniz.

İlk olarak gelin uygulamamızın XAML koduna bir göz atalım.

<UserControl x:Class="SilverlightApplication3.Page"

    xmlns="http://schemas.microsoft.com/client/2007"

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

    Width="400" Height="300">

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

    <TextBox Height="29" Margin="72,37,134,0" VerticalAlignment="Top" Text="TextBox" x:Name="Sayi1"/>

    <TextBox Height="39" Margin="72,81,134,0" VerticalAlignment="Top" Text="TextBox" x:Name="Sayi2"/>

    <Button HorizontalAlignment="Stretch" Margin="114,144,188,122" VerticalAlignment="Stretch" Content="Button" x:Name="Topla"/>

    <TextBlock Height="43" Margin="86,0,147,47" VerticalAlignment="Bottom" Text="TextBlock" TextWrapping="Wrap" x:Name="Sonuc"/>

  </Grid>

</UserControl>

Şimdi kod tarafına geçerek bir önceki adımda referans olarak projemize eklediğimiz WCF servisini kullanmaya başlayalım.

WithEvents Servis As New WCFServisim.ServiceClient

Yukarıdaki şekli ile servisimizi uygulama içerisinde global olarak tanımlıyoruz. WCF servisimi bu şekilde tanımlamamın aslında önemli bir nedeni var. Birazdan WCF servisi ile istemci tarafından suncuya bir veri talebi gönderdiğimizde, yani toplanacak olan sayıları gönderip toplamı istediğimizde aslında asenkron bir talepte bulunmuş olacağız. Klasik Windows uygulamalarından alıştığımız yapıdan farklı olarak Silverlight 2.0 içerisinde WCF servislerinin kullanımı tamamen asenkron olarak gerçekleşiyor. Durum böyle olunca asenkron bir istek sonrasında sunucudan cevap (veri) geldiğinde bizim kodumuzun da durumdan haberdar edilmesi gerekecek. Söz konusu haber yine WCF servisimize özel olan bir başka event-handler'ın çalıştırılması ise bize ulaştırılacak. Aslında dinamik olarak servisimizi yaratırken event-handler da bağlayabilirdik. Ama Visual Basic ile yukarıdaki gibi bir kullanım çok daha rahat oluyor. C# programcıları dinamik event-handler bağlamayı kullanabilirler.

Global değişkenimizde WCF servisimiz hazır olduğuna göre artık düğmemize bazıldığında söz konusu servisi rahatlıkla kullanabiliriz.

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

        Servis.ToplamaAsync(Integer.Parse(Sayi1.Text), Integer.Parse(Sayi2.Text))

    End Sub

Gördüğünüz gibi Servis değişkenim üzerinden ToplamaAsync metodunu çağırıyorum. Metodu çalıştırdıktan sonra sunucudan veri geldiğinde bu metoda özel olan ToplamaCompleted event'ı çalıştırılacak.

    Private Sub Servis_ToplamaCompleted(ByVal sender As Object, ByVal e As WCFServisim.ToplamaCompletedEventArgs) Handles Servis.ToplamaCompleted

        Sonuc.Text = e.Result.ToString

    End Sub

ToplamaCompleted event'ına gelen parametrelerden ikincisinin tipine baktığımızda ToplamaCompletedEventArgs ile karşılaşıyoruz. Bu tamamen bizim metodumuza özel bir değişken tipi. Buradan yola çıkarak e.Result dediğimizde ise doğrudan bizim WCF metodumuzun döndürdüğü nesneyi yakalayabiliyoruz. Örneğimizde gelen sonucu uygulama içerisinde bir TextBlock içine yazdırıyoruz.

Kodumuzun tamamına baktığımızda aşağıdaki manzara ile karşılaşıyoruz.

Partial Public Class Page

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    WithEvents Servis As New WCFServisim.ServiceClient

 

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

        Servis.ToplamaAsync(Integer.Parse(Sayi1.Text), Integer.Parse(Sayi2.Text))

    End Sub

 

    Private Sub Servis_ToplamaCompleted(ByVal sender As Object, ByVal e As WCFServisim.ToplamaCompletedEventArgs) Handles Servis.ToplamaCompleted

        Sonuc.Text = e.Result.ToString

    End Sub

End Class

Peki ya C# olsaydı?

Visual Basic'e özel yapılar kullandığım için aynı kodun C# muadilini de sizlerle paylaşmak istiyorum. Böylece C# programcıları için anlaşılması çok daha kolay olacaktır.

namespace SilverlightApplication4

{

    public partial class Page : UserControl

    {

        public Page()

        {

            InitializeComponent();

            Topla.Click += new RoutedEventHandler(Topla_Click);

        }

 

        void Topla_Click(object sender, RoutedEventArgs e)

        {

            WCFServisim.ServiceClient Servis = new WCFServisim.ServiceClient();

            Servis.ToplamaCompleted += new EventHandler<WCFServisim.ToplamaCompletedEventArgs>(Servis_ToplamaCompleted);

            Servis.ToplamaAsync(int.Parse(Sayi1.Text), int.Parse(Sayi2.Text));

        }

 

        void Servis_ToplamaCompleted(object sender, SilverlightApplication4.WCFServisim.ToplamaCompletedEventArgs e)

        {

            Sonuc.Text = e.Result.ToString();

        }

    }

}

Hepinize kolay gelsin.

Thursday, April 24, 2008 3:56:39 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Silverlight 2.0 | WCF  | 
 Saturday, April 19, 2008

.NET Framework 3.0 ile beraber gelen WPF, WCF ve WF sonrasında VS 2008 ve .NET Framework 3.5 derken aslında epey bir yenilik ile karşı karşıya kaldık. Bu konularda Microsoft'un sertifikasyonlarında şu ana kadar yeni bir sistem oluşturulmamıştı, zaten bu konularda sertifikasyon sınavları da yoktu. Oysa artık sizlere güzel haberlerim var; Visual Studio 2008 ile beraber yeni sertifikasyonlar ve sınavlar tam olarak belli oldu.

Visual Studio 2008 MCTS Sertifikasyon Sınavları
Visual Studio 2008 MCTS Sertifikasyon Sınavları

Yukarıdaki görselde de görebileceğiniz üzere toplam altı adet yeni MCTS sertifikasyonu söz konusu. Her biri özellikle .NET Framework 3.5 olarak isimlendirimiş durumda. WPF, WCF ve WF'i görmek gerçekten hoş. Diğer yandan ADO.NET'in ayrı bir sertifikasyon yolu olarak seçilmesi ise gerçekten ilginç. Yukarıdaki sınavlardan 70-502,503 ve 504 şu an açık durumda. Diğerleri önümüzdeki aylarda açılacak.

Visual Studio 2008 MCPD Sertifikasyon Sınavları
Visual Studio 2008 MCPD Sertifikasyon Sınavları

MCPD yolunda da ilginç gelişmeler var. Windows Developer ve EA Developer'ın sonuna .NET Framework'ün sürüm numarası eklenmiş. Böylece hangi sürümün yazılım geliştiricisi olduğunuz doğrudan belli olacak. Web Developer sertifikasyonu ise artık yok, onun yerine ASP.NET Developer 3.5 şeklinde yeni bir sertifikasyon var. Aslında bu çok doğru bir adım olmuş. Çünkü Web Developer adı çok daha geniş kapsamlı, oysa sınavlarda doğal olarak sadece Microsoft ürünleri soruluyor. O nedenle ASP.NET Developer adı bence çok daha uygun olmuş.

Visual Studio 2008'e Upgrade Sertifikasyon Sınavları
Visual Studio 2008'e Upgrade Sertifikasyon Sınavları

Her zamanki gibi eski sertifikalı uzmanlar için "upgrade" sınavları da olacak. Yükseltme sınavları ile ilgili detayları yukarıdan inceleyebilirsiniz. Bu sınavların da daha hiçbiri yayında değil.

Yeni sertifikasyonlar ve sınavlar gerçekten güzel organize edilmiş. Ben heyecanla Expression ürün ailesi ve Silverlight sınavlarını bekliyorum. Umarım WPF, WCF ve WF için beklediğimiz kadar beklemek zorunda kalmayız.

Hepinize kolay gelsin.

Saturday, April 19, 2008 8:19:21 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET 3.5 | Visual Basic 2008 | Visual Studio 2008 | WCF | WPF | WF  | 
 Thursday, January 24, 2008

Budan bir süre önce Windows Server 2008 sertifikasyonlarından bahsetmiştim. Bugünlerde Visual Studio 2008 için planlanan sertifikasyonların da bir kısmı duyurulmaya başlandı.

Visual Studio 2005'de olduğu gibi 2008 ile beraber de MCTS ve MCPD ünvanlarına "competency" ler ekleniyor olacak. Şu an için MCTS tarafı belirlenmiş durumda ve öngörülen MCTS'lerin listesi şöyle;

  • Windows Forms Applications
  • ASP.NET Applications
  • Windows Communication Foundation Applications
  • ADO.NET Applications
  • Windows Workflow Foundation Applications
  • Windows Presentation Foundation Applications

Visual Studio 2005 serisi ile beraber girdiğimiz 70-536 sınavı hala geçerli olan ve yeni başlayanların Visual Studio 2008 için de girmek zorunda olacağı bir sınav olacak. Yani bugün yola çıkacak olanların hemen girebileceği bir sınavdan bahsediyoruz :) Yukarıdaki konulardaki sınavlar Mart ayından başlayarak Mayıs sonuna kadar farklı tarihlerde yayınlanmaya başlayacak.

Yeni haberler duyuruldukça sizlere de ulaştırıyor olacağım.

Thursday, January 24, 2008 9:34:37 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   .NET Framework 3.5 | ASP.NET 3.5 | Visual Basic 2008 | Visual Studio 2008 | WCF | WPF  | 
 Saturday, December 01, 2007

ASP.NET 3.5'in gelmesi ile beraber yavaş yavaş yeni AJAX uygulamalarımızı da bu yeni platforma taşımamız gerekiyor. Çoğunuzun Visual Studio 2008'e ait Express sürümlerini hemen bilgisayarlarınıza indirdiğinizden eminim. Bu yazımda bahsetmek istediğim nokta WCF servisleri ile ASP.NET AJAX entegrasyonu. Aslında bildiğimiz üzere WCF hiç de yeni bir teknoloji değil. .NET Framework 3.0 ile uzun süredir hayatımızda olan WCF maalesef gerekli yazılımcı araçlarının zayıflığı nedeniyle pek tercih edilmiyordu. Benim de aslında şu ana kadar bu konuda yazı yazmamamın en önemli nedeni işin gerçekten zor olmasıydı, neyse "bekleyen derviş" misali sonunda Visual Studio 2008 ile yine her şey gerekli kolaylığa kavuştu.

Ben bu yazımda Visual Web Developer 2008 Express Edition kullanacağım. Yazılımı hemen ücretsiz olarak aşağıdaki adresten bilgisayarınıza indirebilirsiniz.

http://www.microsoft.com/express/download/

Visual Web Developer 2008 ile yeni bir web sitesi yarattıktan sonra eklenen ilk default.aspx dosyasına bir ScriptManager yerleştiriyoruz. Böylece artık söz konusu sayfa ASP.NET AJAX destekli bir sayfa oluyor. Malum, artık AJAX özellikleri ASP.NET 3.5 ile beraber zaten dahili olarak geliyor ve herhangi bir ek ayar veya yükleme gerektirmiyor. Sayfamızı bu hali ile bıraktıktan sonra hemen projemize bir WCF servisi ekleyelim. Bunun için "Solution Explorer" içerisinde projeye sağ tuş ile tıklayarak gelen menüden "Add new Item" dedikten sonra "AJAX-Enabled WCF Service" seçeneğini seçmemiz gerekiyor.

Projemize yeni bir WCF servisi ekliyoruz.
Projemize yeni bir WCF servisi ekliyoruz.

Projemize yukarıdaki şekli ile bir WCF servisi eklediğimizde VWD (Visual Web Developer) bizim için gerekli WCF end-point ayarlarını Web.Config içerisinde otomatik olarak yapmakla birlikte AJAX ile kullanabilmemiz için servisin gerekli JavaScript arayüzlerini de yaratmasını sağlıyor. Web.Config içerisine baktığımızda aşağıdaki ek düzenlemeleri görüyoruz.

<system.serviceModel>

  <behaviors>

    <endpointBehaviors>

      <behavior name="ServiceAspNetAjaxBehavior">

        <enableWebScript />

      </behavior>

    </endpointBehaviors>

  </behaviors>

  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

  <services>

    <service name="Service">

      <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior"

      binding="webHttpBinding" contract="Service" />

    </service>

  </services>

</system.serviceModel>

Gelin şimdi de yeni yaratmış olduğumuz ve benim örneğimde adını service.svc verdiğim WCF servisimizin kodların bir bakalım.

Imports System.ServiceModel

Imports System.ServiceModel.Activation

Imports System.ServiceModel.Web

 

<ServiceContract(Namespace:="")> _

<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _

Public Class Service

 

    <OperationContract()> _

    Public Function Topla(ByVal Sayi1 As Integer, ByVal Sayi2 As Integer) As Integer

        Return Sayi1 + Sayi2

    End Function

 

End Class

Aslında yukarıdaki kodun büyük bölümü VWD tarafından zaten otomatik olarak yerleştirilmişti. Benim tek yaptığım kendi Function'ımı yazmak oldu. Test amacıyla iki parametre alarak bunları toplayıp geri döndüren bir Function hazırladım. Bu noktada özellikle dikkat etmemiz gereken nokta bu Function'ların <OperationContract()> _ şeklinde işaretlenmiş olmasının gerektiği. Artık web servisim bittiğine göre sıra geldi default.aspx'e dönerek gerekli JavaScript kodlarını yazmaya.

İlk olarak web servisim tarafından toplanacak iki sayıyı kullanıcıdan almak üzere iki adet HTML kutusunu ve toplama işlemini tetikleyecek olan HTML düğmesini sayfama yerleştiriyorum. Sonrasında da ScriptManager'a ServiceReference olarak WCF servisimi tanıtıyorum.

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

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

        <Services>

            <asp:ServiceReference Path="service.svc" />

        </Services>

    </asp:ScriptManager>

    <input id="Sayi1" type="text" />

    <input id="Sayi2" type="text" />

    <input onclick="Baslat()" id="Button1" type="button" value="button" />

    </form>

Yukarıdaki kodu incelerseniz HTML Button nesnesinin Baslat adında bir JavaScript fonksiyonunu tetiklediğini görebilirsiniz. Sıra geldi bu JavaScript fonksiyonlarını yazarak web servisindeki kodumuzu asenkron olarak kullanmaya.

Visual Web Developer 2008 ile beraber gelen JavaScript Intellisense.
Visual Web Developer 2008 ile beraber gelen JavaScript Intellisense

Baslat adını verdiğim JavaScript fonksiyonumu yazarken aynen eskiden ASP.NET AJAX Extension içerisinde Web Servisilerini kullandığımız gibi WCF servisinin de sınıf ismi üzerinden tüm yazdığımız metotlara ulaşabiliyoruz. Daha da güzeli tüm bunlar tamamen Intellisense desteği ile geliyor :) Kodumuzu tamamladığımızda sayfanın tamamının kodu aşağıdaki şekilde sonlanıyor.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

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

<head runat="server">

    <title>Untitled Page</title>

    <script type="text/javascript">

    function Baslat()

    {

        Service.Topla($get("Sayi1").value, $get("Sayi2").value,Tamamlandi);

    }

    function Tamamlandi(Data)

    {

        alert(Data.toString());

    }

    </script>

</head>

<body>

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

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

        <Services>

            <asp:ServiceReference Path="service.svc" />

        </Services>

    </asp:ScriptManager>

    <input id="Sayi1" type="text" />

    <input id="Sayi2" type="text" />

    <input onclick="Baslat()" id="Button1" type="button" value="button" />

    </form>

</body>

</html>

Baslat JavaScript fonksiyonunda $get AJAX Extension kısayol metodları ile sayfadaki Sayi1 ve Sayi2 adındaki HTML elementlerini yakalayarak içlerindeki değerleri AJAX ile asenkron olarak web servisime gönderiyorum. Gelen sonuç Tamamlandi metoduma parametre olarak geliyor ve ben de bir JavaScript mesaj kutusu ile bunu kullanıcıya gösteriyorum.

Sonuç

Görüldüğü üzere eski web servislerini kullanmak ile WCF servislerini kullanma noktasında artık pek bir fark kalmamış durumda. O nedenle "Yaşasın WCF" :)  sloganı ile hepinize kolay gelsin diyorum :)

Saturday, December 01, 2007 11:17:28 AM (GTB Standard Time, UTC+02:00)  #    Comments [4]   AJAX | WCF  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.