Makale Özeti

WPF'in tüm görsel gücünden faydalanarak internet tarayıcıları içerisinde veri uygulamaları hazırlamak istiyorsanız bu yazımızdaki WPF Browser Application'ların web servisleri ile sunucudaki veriye ulaşmalarında dair örnek ilginizi çekecektir.

Makale

WPF teknolojisi Windows uygulamalarında bize iki ve üç boyutlu animasyonlarla zengin kullanıcı arayüzleri hazırlama şansı tanırken WPF Browser Application (XBAP) yapısı ile beraber bu uygulamaları istersek İnternet Tarayıcısı içerisine de taşıyabiliyoruz. Tabi bu noktada istemci tarafında ufak ve sıkıcı bir ihtiyacımız var; .NET Framework. WPF Browser Application projenizi geliştirirken kullanmış olduğunuz .NET Framework sürümünün istemcilerde de yüklü olması şart. Browser Application şablonu Expression Blend ile beraber gelmese de Visual Studio içerisinde böyle bir proje yaratılarak aynı proje rahatlıkla Expression Blend ile beraber açılabiliyor.

Örneğimizde basit bir uygulama yaparak iki metin kutusu, bir düğme ve bir de etiket (TextBlock) kullanacağız. TextBox'lar içerisine yazılan değerler bir web servisine gönderilecek ve web servisi söz konusu değerlerin toplamını alarak uygulamamıza geri verecek. Normalde tabi ki çok basit bir şekilde bu işlem istemci tarafında WPF ile halledilebilir fakat bizim amacımız bir web servisi kullanarak WPF Browser Application içerisinden sunucuya veri göndererek veri alabiliyor olmak. Böylece rahatlıkla sunucu tarafındaki uygulama da kendisine gelen verilere göre herhangi bir veritabanı sistemini sorgulayarak uygun bilgileri geri döndürebilecektir.

WPF Browser Application'ı tasarlayalım...

İlk olarak uygulamamızı Visual Studio içerisinde "File / New Project" menüsünden "WPF Browser Application" proje şablonunu seçerek yarattıktan sonra görsel tasarımını tamamlayalım. Uygulama içerisine otomatik olarak yerleştirilecek olan ana sayfamız "Page1.XAML" dosyasını doğal olarak Expression Blend ile düzenlememiz gerekiyor. Bunun için Visual Studio içerisinde yarattığımız bu projeyi Expression Blend ile de açarak XAML dosyasını düzenlememiz gerek.

<Page x:Class="Page1"

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

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

  Title="Page1">

    <Grid Width="250" Height="400">

      <Grid.RowDefinitions>

        <RowDefinition Height="0.168*"/>

        <RowDefinition Height="0.155*"/>

        <RowDefinition Height="0.132*"/>

        <RowDefinition Height="0.545*"/>

      </Grid.RowDefinitions>

      <TextBox Text="TextBox" TextWrapping="Wrap" x:Name="Kutu1"/>

      <TextBox Grid.Row="1" Text="TextBox" TextWrapping="Wrap" x:Name="Kutu2"/>

      <Button Grid.Row="2" Content="Button" HorizontalAlignment="Center" Width="100" Height="40" x:Name="Dugme"/>

      <Label Margin="8,8,8,0" VerticalAlignment="Top" Height="27" Grid.Row="3" Content="Label" x:Name="Etiket"/>

    </Grid>

</Page>

Hazırlamış olduğumuz uygulamanın yukarıdaki XAML kodunu incelediğinizde ekranda iki adet metin kutusu, bir düğme ve bir de TextBlock olduğunu göreceksiniz. Tüm bu kontrolleri bir Grid içerisine yerleştirerek ekranda sabit bir şekilde görünmelerini sağlıyoruz.

Web servisimizi hazırlayalım

Sıra geldi web servisimizi hazırlamaya. Bunun için Visual Studio içerisinde üzerinde çalıştığımız Solution yapısına yeni bir ASP.NET 3.5 web projesine ekleyeceğiz. "File / Add / New Project" menüsünden "ASP.NET Web Application" seçeneğinden ilerleyebilirsiniz. Yarattığımız web sitesine "WebService1.asmx" adında yeni bir web servisi ekleyerek aşağıdaki şekilde kodumuzu yerleştirelim.

[VB]

Imports System.Web.Services

Imports System.Web.Services.Protocols

Imports System.ComponentModel

 

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

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

<ToolboxItem(False)> _

Public Class WebService1

    Inherits System.Web.Services.WebService

 

    <WebMethod()> _

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

        Return x + y

    End Function

 

End Class

[C#]

using System;

using System.Collections;

using System.Linq;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Xml.Linq;

 

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class WebService : System.Web.Services.WebService

{

 

    public WebService()

    {

    }

 

    [WebMethod]

    public int Topla(int x, int y)

    {

        return x + y;

    }

}

Sıra geldi bu web servisini WPF Browser Application içerisinde kullanmaya.

Reference ekleyelim

Web servisinizi hazırladıktan sonra rahatlıkla WPF Browser Application projenize sağ tıklayarak ve "Add Service Reference" diyerek web servisinizi bulup referans olarak ekleyebilirsiniz. Sonrasında normal bir Winforms uygulamasında olduğu gibi uzaktaki servisi kullanabilirsiniz.

[VB]

Class Page1

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

        Dim Servis = New ServiceReference1.WebService1SoapClient

        Etiket.Content = Servis.Topla(Kutu1.Text, Kutu2.Text)

    End Sub

End Class

[C#]

    public partial class Page1 : Page

    {

        private void Dugme_Click(object sender, RoutedEventArgs e)

        {

            ServiceReference1.WebServiceSoapClient Servis = new WpfBrowserApplication1.ServiceReference1.WebServiceSoapClient();

            Etiket.Content = Servis.Topla(int.Parse(Kutu1.Text), int.Parse(Kutu2.Text)).ToString();

        }

    }

Yukarıdaki kodumuzda basit bir şekilde ServiceReference1 üzerinde servisimizi tanımlayarak içerisindeki Topla metodunu kullanıyoruz. Sonucu da WPF uygulamasında Etiket adındaki TextBlock içerisine yazdırıyoruz.

Sorunlar baş gösteriyor...

Fakat ufak bir sorun var. WPF Browser Application'ı Visual Studio içerisinden çalıştırdığınızda doğrudan dosya sistemi üzerinden çalıştırılacaktır, yani IIS veya ASP.NET Development Server devreye girmeyecektir. Oysa bizim web servisi ASP.NET Development Server üzerinde çalışmak zorunda. Visual Studio'nun web servisini ASP.NET Development Server üzerinden çalıştırırken WPF Browser Application'ı dosya sisteminden çalıştırması bizi büyük bir sorunla baş başa bırakacak; "Güvenlik".

Artık hem AJAX hem de Silverlight nedeniyle çoğumuzun bildiği üzere istemci tarafında bir alan adından yola çıkarak başka bir alan adına bağlanıp veri alımı veya gönderimi yapamazsınız. WPF Browser Application dosya sisteminden başlatıldığında maalesef web servisini "başka bir alan adında" olarak algılayacağı için veri trafiği gerçekleşmeyecektir. Bu durumda yapılacak şey belli; WPF Browser Application'ı bizim web servisi ile aynı projeye "output" ettirmemiz, aslında Publish etmemiz gerek.

WPF Browser Application projenize sağ tuş ile tıklayın ve "Publish" komutu verin. Yayınlanacak konum olarak web servisinize ait dosyaların bulunduğu ASP.NET sitenizin ana klasörünü gösterin. Böylece WPF Browser Application hazırlanarak web sitenize yerleştirilmiş olacak. Şimdi ASP.NET Development Server üzerinden XBAP dosyasını açabilir ve uygulamanızı gönül rahatlığı ile kullanabilirsiniz.

Hepinize kolay gelsin.