Silverlight 2.0 Beta 1 ile Klasik ASMX Web Servisi kullanımı

0 dakikada yazıldı

6825 defa okundu

Düzenle

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.