WPF Browser Application ve Web Servisleri ile Veri Uygulamaları

0 dakikada yazıldı

10130 defa okundu

Düzenle

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.