Makale Özeti

Bu yazımızda Silverlight 2.0 ile .NET dillerini kullanarak istemci tarafından sunucudaki bir klasik ASMX web servisine asenkron veri gönderimi ve alımını inceleyeceğiz.

Makale

Silverlight 2.0 ile beraber .NET dillerini kullanabilirker aslında sunucu tarafındaki veriye ulaşma yapısı biraz değişiyor. Normal şartlarda istemci tarafından sunucuya bağlanabilmek için AJAX isteklerini kullanırken artık istemci tarafında elimizde .NET varken ne yapacağız?

İşte bu soruya bir cevap olarak klasik ASMX web servislerinin Silverlight 2.0 Beta 1 ile kullanımına göz atarak hali hazırda elimizde web servisleri ile bulunan projelere nasıl Silverlight 2.0 Beta 1 uygulamalarını bağlayabileceğimizi göreceğiz.

Klasik ASMX servisimiz hazır

Örneğimizde kullanılmak üzere kendisine verilen iki sayıyı toplayarak geri döndüren bir method'u harici bir web servisi olarak hazırlayarak Silverlight uygulamamıza bağlayacağız. Bunun için Silverlight uygulamamızı host edecek olan ASP.NET 3.5 sitesine bir web servisi ekleyerek içerisine aşağıdaki kodu yazıyoruz.

Imports System.Web

Imports System.Web.Services

Imports System.Web.Services.Protocols

 

<WebService(Namespace:="http://tempuri.org/")> _

<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Public Class servisim

    Inherits System.Web.Services.WebService

 

    <WebMethod()> _

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

        Return x + y

    End Function

 

End Class

Bir sonraki adımda Silverlight projemize Visual Studio 2008 içerisinde sağ tıklayarak gelen menüden "Add Service Reference" komutunu vererek servisimizi Silverlight projesine referans olarak ekliyoruz.

Uygulamamızı tasarlıyoruz

Silverlight uygulamamız içerisinde iki adet TextBox, bir Button ve bir de TextBlock yer alacak. Bu TextBox'lardan alınan değerler web servisine gönderilecek. Değerlerin toplam web servisinden geri döndüğünde ise sonuç TextBlock içerisine yazılacak. Hazırlayacağımız örnek bir Silverlight uygulamamısının XAML kodu aşağıdaki şekilde sonuçlanıyor.

<UserControl x:Class="SilverlightApplication2.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="31" HorizontalAlignment="Left" Margin="48,46,0,0" VerticalAlignment="Top" Width="115" Text="" x:Name="Sayi1"/>

        <TextBox Height="31" HorizontalAlignment="Right" Margin="0,46,79,0" VerticalAlignment="Top" Width="116" Text="" x:Name="Sayi2"/>

        <Button Height="33" HorizontalAlignment="Stretch" Margin="133,112,155,0" VerticalAlignment="Top" Content="TOPLA" x:Name="Topla"/>

        <TextBlock Height="42" Margin="87,0,103,72" VerticalAlignment="Bottom" Text="TextBlock" TextWrapping="Wrap" x:Name="Sonuc"/>

    </Grid>

</UserControl>

Servisimizi kullanalım...

Sıra geldi artık işin arkaplanın geçerek kodumuzu yazmaya. Projemize eklediğimiz servis referansına verdiğimiz isim üzerinden servisimizin bir kopyasını yaratarak içerisindeki Toplama metodunu kullanmak istiyoruz.

        Dim BirServis As New KlasikServisim.servisimSoapClient

        BirServis.ToplamaAsync(Sayi1.Text, Sayi2.Text)

Yukarıdaki kod aslında alışık olduğumuz web servisi kullanımından pek farklı değil. Fakat arada ufak bir değişiklik var. Bizim adını "Toplama" olarak koyduğumuz metodun sonuna Async eklenmiş. Aslında bunun anlamı çok basit; Silverlight tarafında çağırdığınız bir web servisi tamamen asenkron olarak çalıştırılıyor. Yani bizim AJAX tarafında alışık olduğumuz istemciden sunucuya bağlanarak veri çekme mantığı bire bir web servisleri için de uygulanmış. Oysa eskiden Windows programlarında web servisleri kullanırken içerisinde bulunduğumuz Threat kesinlikle verinin gelmesini beklerdi.

Peki veri asenkron geliyorsa bizim verinin geldiğinden haberdar olmamız gerekmez mi? Çünkü bu şartlar altında verinin ne zaman sunucudan geleceğini bilemiyoruz. İşte tam bu noktada kodumuz içerisinde dinamik olarak bir event-handler tanımlamamız gerekiyor.

       Dim BirServis As New KlasikServisim.servisimSoapClient

        AddHandler BirServis.ToplamaCompleted, AddressOf Bitti

        BirServis.ToplamaAsync(Sayi1.Text, Sayi2.Text)

        Sonuc.Text = "Hesaplanıyor..."

Yukarıdaki kodumuzda Bitti adındaki bir event-handler'ı servisimizin ToplamaCompleted metoduna bağlıyoruz. Böylece Toplama işlemi tamamlandığında söz konusu event-handler çalıştırılacak. Şimdi bir de veri geldiğinde nasıl TextBlock içerisine yazdıracağımıza göz atalım.

    Public Sub Bitti(ByVal sender As Object, ByVal e As KlasikServisim.ToplamaCompletedEventArgs)

        Sonuc.Text = e.Result

    End Sub

Gördüğünüz gibi bir önceki adımda tanımladığımız Bitti event'ının aldığı ikinci parametre olan ToplamaCompletedEventArgs tipinde e değişkeni üzerinden Result yani sonuca ulaşabiliyoruz. Söz konusu parametre doğrudan Toplama metoduna özel olduğu için içerisinde Result özelliğinin tipi de zaten web servisimizdeki metodun dönüş tipi olan Integer.

Uygulamamızın tam kodu aşağıdaki şekilde sonlanıyor.

Partial Public Class Page

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

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

        Dim BirServis As New KlasikServisim.servisimSoapClient

        AddHandler BirServis.ToplamaCompleted, AddressOf Bitti

        BirServis.ToplamaAsync(Sayi1.Text, Sayi2.Text)

        Sonuc.Text = "Hesaplanıyor..."

    End Sub

 

    Public Sub Bitti(ByVal sender As Object, ByVal e As KlasikServisim.ToplamaCompletedEventArgs)

        Sonuc.Text = e.Result

    End Sub

End Class

Hepinize kolay gelsin.