Merhaba Arkadaşlar;
WCF Servisini, Silverlight ile kullanımını incelicez. Daha önceki örneklerin devamı olarak kabul ettiğimden ve basit olarak inceliceğimizden dolayı, yine aynı Toplama servisi üzerinden işlemleri yapacağız.
İlk olarak yapmamız gereken, Add New Project diyerek, Silverligth kategorisinden yeni bir Silverlight Application uygulaması yaratmak.
daha sonra karşımıza bazı seçenekler sunan ufak bir pencere daha geliyor,
Burada, Silverligt uygulamasını Host etmek için bize bazı seçenekler sunuyor ve buradan ben, Web Application Project üzerinde Host edeceğimi belirtiyorum. Eğer isterseniz Web Site ve ya WVC üzerinden Host işlemini yapabilirsiniz. Eğer Rich internet Application, DomainDatasource vs.. kullanacaksanız, en alttaki Enable WCF RIA Services'i tıklamanız gerekiyor. Bu yazıdan önce, WPF, ve AJAX Base üzerinden aynı servisi kullandık onun için bu yazımızın devam niteliğinde olduğunu söylüyorum. Daha sonraki yazılarda, EF, Linq, Domain Class ve AppFabric önbellekleme gibi işlemleri yapıcaz.
Servisimizi barındıran Web Aplication üzerinde Add New Iteam diyerek, Silverlight üzerinde çalışacak olan Silverlight Enabled WCF Service'i seçerek, projemize servisimizi ekliyoruz.
Bu seçenek bize, Silverlight ile WCF kullanımı için gerekli olan ayarları yapıyor. Bunları manuel olarak siz de yapabilirsiniz ama hazır yapılmışı var :)
Normalde servisimizi bir interface üzerinden implemente ederiz, ancak burada direk class üzerinde işlemler hazır olarak geliyor.
using System.ServiceModel;
using System.ServiceModel.Activation;
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class slService
{
[OperationContract]
public void DoWork()
{
// Add your operation implementation here
return;
}
// Add more operations here and mark them with [OperationContract]
}
Bu servis için ihtiyacımız olan namespace'ler yukarıdaki gibidir. bu otomatik olarak yaratılan metot, biz bunu ihtiyacımız doğrultusunda değiştiricez.
DoWork() olarak gelen şablonu aşağıdaki gibi değiştiriyorum,
[OperationContract]
public double Topla(double x, double y)
{
return x + y;
}
Bunun haricinde yapılması gereken sadece, bu servisi Add Service Referance diyerek, MainPage.xaml olan Silverlight uygulamıza refrans olarak göstermek.
Bu işlemlerden sonra web.config doyamız aşağıdaki gibidir;
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="slWCFservisi.Web.slService.customBinding0">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="slWCFservisi.Web.slService">
<endpoint address="" binding="customBinding" bindingConfiguration="slWCFservisi.Web.slService.customBinding0"
contract="slWCFservisi.Web.slService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>
Servisimiz ve Silverlight uygulamamız aynı Solution içinde olduğu için, Discover diyerek bu servise ulaşabilirsiniz.
MainPage.xaml sayfamıza gelip, üzerine TextBox, Label ve Button kontrollerini ekleyelim.
Button_Click Event'ına geçip, gerekli olan kodlarımızı yazmaya başlayabiliriz.
ilk olarak
using slWCFservisi.slToplamaServisi;
eklememiz diğer kodların daha sade görünmesi için bence öenmli.
ilk olarak, slServiceClient'tan client adında bir nesne tanımlayım, servisimize ulaşıyoruz. TextBox'lardan gelecek olan değerlerin içerikleri, Text olduğu için, bunları double tipine çevirmemiz gerekiyor çünkü servisimizde tanımladığımız Topla() metodumuz doıble tipinde bir değer döndürüyor.
Burada işlemler diğer servislerden farklı. Normalde Client.Topla(); diyerek direk olarak parametreleri servisimize gönderebilir ve gelen sonucu double tipinde bir değişkene atayabilirdik. Ancak burada karşımıza ToplaAsyc ve ToplaComplated'ler çıkkıyor. Nekadar button Click Event'ı içinde bu tetiklenecek olsa da, burada EventHandler yardımı ile yapmak zorundayız. Daha sonrada sonucu gösterebilmek için, target olarak belirtilen bir void tipindeki metotdan yarlanmalıyız. Bunların hiç birisi kafanızı karıştırmasın, normak bir EventHadler ekleme işlemi yaparken kullanılan += operatörünü yazıp TAB tuşuna bastığınızda VS bu işlemlerin hepsini bizim için otomatiok olarak gerçekleştiriyor.
Event ile işimiz bittikten sonra, geriye kalan iki işlemimiz var, client.ToplaAsync(x,y) değerlerini metot'a aktarmak ve sonucu gösterecek olan label.Contet'e void tipinde tanımlanan client_ToplaComplated'ın e.Result ile sonucu aktarmak.
private void button1_Click(object sender, RoutedEventArgs e)
{
slServiceClient client = new slServiceClient();
double x = Convert.ToDouble(textBox1.Text);
double y = Convert.ToDouble(textBox2.Text);
client.ToplaCompleted += new EventHandler<ToplaCompletedEventArgs>(client_ToplaCompleted);
client.ToplaAsync(x, y);
}
void client_ToplaCompleted(object sender, ToplaCompletedEventArgs e)
{
label1.Content = e.Result.ToString();
}
Referasımızı ekledik, client tarafında kodumuzu yazdık, ve ServiceReferance.Client.config, dosyamız aşağıdaki gibidir;
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding_slService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:50205/slService.svc" binding="customBinding"
bindingConfiguration="CustomBinding_slService" contract="slToplamaServisi.slService"
name="CustomBinding_slService" />
</client>
</system.serviceModel>
</configuration>
F5 ile projemizi bir TestPage üzerinde çalıştırabilir ve servisimizi test edebiliriz.
Açıkcası çok detaylı bilgilere girmiyorum, iler seviye makalelere geçtiğimizde ne demek istediğimi anlıcaksınız.
Kolaygelsi.