10 Mart 2012 Cumartesi

Adım Adım WCF-4 (örnek)

Herkese merhabalar, “Adım Adım WCF” makaleler dizimize bıraktığımız yerden devam ediyoruz. Şuana kadar yaptıklarımızı toparlamak gerekirse;
-End Point tanımlama
-Servis yazma kuralları
-Servisi Host etme şekillleri
şeklinde ilerledik. Ve WCF in neden kullanmamız gerektiğini inceledik. Bu makalede ise artık gerçek bir WCF örneğini hep beraber inceleyeceğiz.

ANALİZ

Yazacağımız WCF uygulaması 2 adet projeden oluşacak. Bunlardan biri WCF uygulaması, diğeri ise bu uygulamayı kullanacak bir Console uygulaması. WCF uygulamızda HttpBinding kullanılarak bir endpoint tanımlanacak ve IIS üzerinden host edilecek. Console Uygulamamız WCF Servisimizde bulunan iki adet metodu çağıracak.
Bu metodlar “GetEmployerList”(Çalışanları Listeler) ve “GetEmployerName”(id ye göre ilgili çalışanları getirir.)
Aşağıdaki diyagram danda görüleceği üzre WCF uygulamamızda “Employer” sınıfı, “IEmployerService” arayüzü(WCF Contract ımız) ve “EmployerService” servisimiz bulunmaktadır.
Bu sınıfları tek tek inceleyelim:

Employer Sınıfı

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;


namespace DemoService
{
[DataContract]
public class Employer
{

  private int id;
  private string name;

  [DataMember]
  public int Id
  {
      get { return id; }
      set { id = value; }
  }

  [DataMember]
  public string Name
  {
      get { return name; }
      set { name = value; }
  }
}
}
Employer, servisimiz içinde kullandığımız bir sınıftır Bu nedenle Sınıfı “DataContract” ve elemanlarınıda “DataMember” nitelikleri ile imzalıyoruz. 
 


IEmployerService (Contract)

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace DemoService
{
[ServiceContract]
interface IEmployerService
{
  [OperationContract]
  String GetEmployerName(int employerId);

  [OperationContract]
  List<Employer> GetEmployerList();
}
}
IEmployer arayüzünü Contract olarak kullanmak istediğimiz için bu sınıfı “ServiceContract” niteliği ile imzalıyoruz. Bu sınıf içindeki iki metodu da kullanmak istediğimiz için iki metoduda “OperationContrat” niteliği ile imzalıyoruz.
 


EmployerService

namespace DemoService
{
public class EmployerService : IEmployerService
{
  List<Employer> employerList = new List<Employer>();

  public EmployerService()
  {
      employerList.Add(new Employer { Id = 1, Name = "Onur Simsek" });
      employerList.Add(new Employer { Id = 2, Name = "Pamir Erdem" });
      employerList.Add(new Employer { Id = 3, Name = "Emir Elkabes" });
      employerList.Add(new Employer { Id = 4, Name = "Tarık Kranda" });
      employerList.Add(new Employer { Id = 5, Name = "Necdet Terkes" });
  }

  public string GetEmployerName(int employerId)
  {
      var employer = employerList.First(p => p.Id == employerId);
      return employer.Name;
  }

  public List<Employer> GetEmployerList()
  {
      return employerList;
  }
}
}
Servisimizin kodlarını incelediğimizde ; Öncelikle Contract ımızı implemente ettik. Sınıfımızın yapıcı metodunda bir employerList in içini doldurduk ve ardından metdolarımızda bu listeden faydalandık.
 


Hosting



Hosting için web.config dosyamızda aşağıdaki şekilde değişiklikler yapıyoruz.
<system.serviceModel>
<services>
<!--  .....ENDPOINT TANIMLANIYOR............  -->
<service behaviorConfiguration="DemoService.EmployerServiceBehavior" name="DemoService.EmployerService">
<endpoint address="localhost/DemoService" binding="wsHttpBinding" contract="DemoService.IEmployerService"></endpoint>
</service>
</services>
  <!--  .......BEHAVIOR TANIMLANIYOR.............  -->
<behaviors>
<serviceBehaviors>
<behavior name="DemoService.EmployerServiceBehavior">
  <serviceMetadata httpGetEnabled="true"/>
  <serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>


Servisimizi IIS üzerinde HTTP protokolü üzerinden yayınlayacağımız için endpoint tanımında binding="wsHttpBinding" olarak seçildi. Dikkat ettiyseniz endpointdışında bir de behavior tanımladık. Bu kısım servisimizin metadata yayınlayabilmesini sağlamaktadır. Bu kısım olmadan karşı taraf proxy dosyasını oluşturacak metadata ları göremez.






Servis uygulamamızdan sonra birde client uygulamamıza bakalım. İşe Servisimizi servis referansı olarak eklemekle başlayalım.




Sonrasında ise uygulamamızda servisimizin bir örneği yaratıp gerekli metodları kullanıyoruz.




Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DemoWCF.ClientConsole.EmployerService;
using System.Threading;

namespace DemoWCF.ClientConsole
{
class Program
{
  static void Main(string[] args)
  {
      Console.WriteLine("..........Merhaba WCF!.........");
      while (true)
      {
          Console.WriteLine("Kişileri listelemek için 1 e, Id ile kişi aramak için 2 ye basınız.");
          string num = Console.ReadLine();
          EmployerServiceClient client = new EmployerServiceClient();
          if (num == "1")
          {
              Employer[] employers = client.GetEmployerList();
              foreach (Employer employer in employers)
              {
                  Console.WriteLine(employer.Id + " - " +  employer.Name);
              }
          }
          else
          {
              Console.WriteLine("Id giriniz:");
              Console.WriteLine(client.GetEmployerName(Convert.ToInt32(Console.ReadLine())));
          }
      }
  }
}
}




Kullanıcı tarafındada yapılacaklar bundan ibaret. Şimdi uygulamamızı çalıştıralım ve nasıl sonuç verecek hep beraber görelim.




Uygulamayı buradan indirebilirsiniz. Bundan sonraki makalelerde WCF ile ilgili farklı uygulamalardan ve özellikle WCF 4.0 ve WCF ve WF entegrasyonundan bahsetmeye çalışacağım. Bir sonraki makalede görüşmek dileğiyle.

Kaynak: http://simsekonur.blogspot.com/2009/04/adm-adm-wcf-4-ornek.html

Hiç yorum yok: