Caner Tosuner

Leave your code better than you found it

Web Service Nasıl Yazılır ?

Web Service günümüz teknolojilerinin olmazsa olmazları arasında yer almaktadır. Bunun en büyük nedeni M2M iletişimin önünü açmak ve back-end sistemde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamaktır.  

.Net tarafında çeşitli Web Service yazma yolları vardır bunlardan bir tanesi asmx dediğimiz [WebMethod]’ lar kullanılarak yazılan servislerdir. Aşağıda ki örnekte Database’den veri çekilerek nasıl bir asmx servis yazılıp çekilen veri internet ortamında yayınlanır ona değiniyor olacağız.

1.Adım | Projenin Oluşturulması

  • Öncelikle aşağıdaki resimde de olduğu gibi ismi "WebService" olan bir adet Asp.Net Empty Web Application oluşturuyoruz

2.Adım | Projeye Web Service Sayfası Eklenmesi

  • Projeyi oluşturduğumuzda içerisinde default olarak Properties, References ve Web.config sayfalar geliyor. WebMethod yazabilmek için Proje ismine sağ tıklayıp aşağıda ki resimde de olduğu gibi bir adet ismi "WebMethods" olan WebService sayfası ekliyoruz.

  3.Adım | WebMethod 'un Anlaşılması

  • Service sayfasını ekledikten sonra kodlarını açtığımızda içerisinde default olarak gelen bir adet HelloWorld() metodu bulunmaktadır
[WebMethod] // [WebMethod] tag'i altında yazılı olan Metodun bir "Web Method" olduğunu belirten yapıdır. Aslında kabacası bizim internette yayınlayacağımız ve Client tarafında kullanılacak metod olduğunu belirtiyor.
publicstring HelloWorld()  //Herbir .asmx service sayfasında Default olarak gelen parametre almadan geriye string dönen HelloWorld() bulunmaktadır.Browser'da servici çalıştırdığınızda aşağıda resimde olduğu gibi metodları görüyor olacaksınız
DipNot - [WebMethod] tanımlaması yapılan metodlar Browser'da görünmeyecektir, Sadece [WebMethod] etiketine sahip metodlar burda görünür ve Client tarafından direkt olarak kullanılır
{
return"Hello World";
}

4.Adım | Web Service Nasıl Bir İşlem Yapıyor Olacak ?

  • Geliştireceğimiz Web Service local'de bulunan Northwind Database'ine bağlanarak Employees tablosunda bulunan Çalışanların Ad(FirstName), Soyad(LastName) ve İş Tanımı(Title) bilgilerini yayınlıyor olacak.Bunun için öncelikle pc'nizde Northwind database'i bulunuyor olması gerekli. Olmayan arkadaşlar bu Link' teki script'i indirip MS-SQL Management Studio kullanarak kurulum yapabilirler.

5.Adım | Database'den Employees Bilgilerini Çeken Metodun Yazılması

  • Database ile bağlantı kurmanın çeşitli yolları vardır.İster Entity Framework kullanırsınız istersenizde klasik Ado.Net yazarsınız.Ben Ado.Net'in Entity Framework ve yandaşlarına kıyasla 7 kat gibi bir hız farkıyla çalışmasında dolayı Ado.Net kullanıyor olacağım Smile. İlk olarak "Employees" tablosundan "FirstName" ,"LastName" ve "Title" bilgilerini almamız için bu attributelere sahip "Employees" class'ını aşağıdaki gibi oluşturuyoruz
public class Employees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
 }
  • Şimdi ise Ado.Net kullanarak çekeceğimiz bu Employees'leri List<Employees> array'i oluşturup içerisine atıp sonrasında Web Service' imiz ile yayınlıyor olacağız. Geriye List<Employees> dönen CallEmployees() adında bir metod tanımlayalım ve kodlarımızı aşağıda olduğu içerisine yazalım.
[WebMethod]
public List<Employees> CallEmployees()
{
//Employees'leri içerisine doldurup return ettireceğimiz List<> array
List<Employees> AllEmployees = new List<Employees>();
 
//Local'de bulunan Northwind database'ine bağlanmamızı sağlayan connectionstring'i
SqlConnection conn = new SqlConnection("server=.;database=Northwind;trusted_connection=True");
 
//Hangi bilgileri çekeceğimizi belirttiğimiz sql sorgumuz
SqlCommand cmd = new SqlCommand("select FirstName,LastName,Title from Employees", conn);
conn.Open(); //Sql bağlantısını açıyoruz
SqlDataReader dr = cmd.ExecuteReader();  //DataReader kullanarak verileri alıyoruz
while (dr.Read())
{
//Çektiğimiz verileri Employee nesnesi'nin attribütlerine atayıp sonrasında AllEmployees array'inin içerisine atıyoruz
AllEmployees.Add(new Employees()
{
FirstName = dr.GetString(0),
LastName = dr.GetString(1),
Title = dr.GetString(2)
});
}
//Son olarakda doldurduğumuz array'i return ediyoruz
return AllEmployees;
}
  • Projeyi Run ettiğimizde Browser'da aşağıda olduğu gibi HelloWorld() metoduyla birlikte bizim sonradan tanımladığımız CallEmployees() metodunu görüyor olacağız. 1. resimde bulunan metodumuza tıkladığımızda 2. resimde gördüğümüz sayfa açılıyor olacak ve Çağır butonuna tıkladığımızda son resimde gördüğümüz gibi Database'den gelen veriler XML formatında görüntüleniyor olacak.

 -

 6.Adım | Web Service'in Internet'te Yayınlanması

  • Geliştirmiş olduğunuz bu gibi Web Servic'i yayınlamak için Solution'dan proje üzerine sağ tıklayıp Publish deyip sonrasında generate edilmiş dosyaları web sitenizin bulunduğu ftp' ye atmanız yeterli olacaktır.
  • Yazılmış olan bu web service'i diğer projelerde kullanmak için ise service'in bulunduğu sayfayı projelerinize Reference olarak ekleyip sonrasında içerisinde bulunan metodları kullanabilirsiniz.Biz projede sadece select işlemi yapan bir WebMethod yazdık ama ihtiyaca göre çok daha farklı inserti, update, delete gibi işlemler yapan WebMethod'larda yazılabilir.

 7.Adım | Web Service' de Güvenlik

  • Makalenin başında da bahsettiğimiz gibi Web Service'ler şirketler için büyük önem taşırlar nedeni ise veri'nin sadece istenilen kişiler tarafından kullanılması. Biz yukarıda geliştirmiş olduğumuz projede güvenlik olarak hiç birşey yapmadık yani siz bu projeyi internette publish ettikten sonra çeşitli yazılımlar kullanılarak data-sniffing ile servis'in bulunduğu URL bulunup yazmış olduğunuz metodlar diğer kişiler tarafındanda kullanılabilir.İşte bu gibi durumlarda güvenlik çok büyük öneme sahip oluyor.Konu uzun olduğu için Web Service'de Güvenlik Nasıl Sağlanır ? bir sonraki makalemizde görüyor olacağız. Umarım buraya kadar yazdıklarımız yararlı olmuştur, herhangi bir sorunuz olduğunda e-mail ile ulaşabilirsiniz,

 

Projeyi burdan indirebilirsiniz..

Asmx ve WCF Arasındaki Farklar

  • Asmx SOAP ve Http kullanarak mesajlaşabilirken, WCF default olarak Http olmasıyla birlitke TCP/IP, MSMQ, NamedPipes etc. gibi yapıları da kullanabilmekte.

 

  • Asmx servisler sadece IIS üzerinde Host edilebilirken, WCF IIS, WAS (Windows Process Activation Services), Console Application, Windows NT Services üzerinde host edilebilmektedir.

 

  • Asmx’de güvenlik sınırlıdır. Kimlik doğrulama ve yetkilendirme işlemleri IIS,  Asp.Net ve TCP Protokolü kullanılarak yapılır ve kesin bir güvenlik tutarlılığı yoktur. WCF her bir protokol için ayrı bir güvenlik hizmeti sağlar ve bu yönden daha tutarlı bir güvenlik alt yapısına sahiptir.

 

  • Asmx’de class’a [WebService] tag’i eklenmeliyken, WCF’de class’a [ServiceContract] tag’i eklenmelidir

 

  • Asmx serilization işlemi için XmlSerializer kullanırken WCF XmlSerializer’den daha performanslı olan DataContractSerializer’ı kullanır.

 

WCF Nedir ? (Windows Communication Foundation)

  • .Net Framework 3.0 ile birlikte gelmiştir.
  • Farklı platformlar arasında iletişim sağlamak ve Service Oriented Architecture – SOA için uygulamalar geliştirmek için geliştirilmiştir.
  • Web servisini yayımlamak için HTTP, WSHTTP gibi protokoller kullanılabilir.
  • Servisler IIS üzerinde http kuralları kullanılarak yayınlanabilir, ya da Windows üzerinde TCP - Pipe gibi yöntemlerle barındırılabilir.

 

WCF ana hatlarıyla 3 kısma ayrılır (A-B-C)

1.   Address

-        Bir servisin nerede olduğunu, hangi protokol ile yayınlama yaptığını bildiren bilgidir. Aktif olarak çalışan her servis WCF’ye göre eşsiz bir adrese sahip olmalıdır. 

 

WCF servisine ulaşabilmek için kullanılabilecek protokoller;

-        HTTP (http:// veya https://)

-        TCP (net.tcp://)

-        Peer 2 Peer (net.p2p://)

-        IPC (net.pipe://)

-        MSMQ (net.msmq://)

2.   Binding

-        Uygulamalar tarafından veri göndermek ya da veri almak için servis ile nasıl iletişime geçileceğinin tanımlandığı bölüm. WCF hizmetleri için kullanılabilecek ön tanımlı binding’ ler;

 

 

3.   Contract

-        Bir servisin ne iş yaptığının bilinmesinde rol oynar. Bazı sözleşmeler şunlardır:

·        Servis sözleşmesi (Service Contract): Servis ile yaratılacak olan operasyonların tanımlanmasında kullanılır.

 
 [ServiceContract]

   public interface IService1

   { }
 

·        Veri Sözleşmesi (Data Contract): Servis içerisinde bulunan class’ları tanımlamak için kullanılır. Sınıfların üyeleri Data Member olarak tanımlanır.

 

   [DataContract]
   public class MyClass
   { }
 
            [DataMember]

            public string StringValue

            {

               get { return stringValue; }

               set { stringValue = value; }

            }


 

·        Hata Sözleşmesi (Fault Contract): Servis tarafından tanımlanacak olan hatalar bu yolla tanımlanır.

·        Mesaj Sözleşmesi (Message Contract): Servisler ile mesajlar arasında iletişim kurulmasını sağlar.

 

Endpoints

Clients ile Host arasındaki iletişimi şağlamak için kullanılan bir arayüzdür. Her endpoint’in kendi adresi vardır ve bu adresin benzersiz olması için servisin kendi ana adresine eklenmektedir. Bir WCF servisini aslında endpoint topluluğu olarak düşünebiliriz.

Behaviors

Servis davranışları, servislerin veya istemcilerin fonksiyonelliklerini arttırmak için kullanılırlar. Örneğin servislerin metadata bilgisinin paylaşılıp paylaşılamayacağı, ekstra güvenlik eklenmesi, tracking tracing logging gibi bilgilerin tutulması, parametre ve mesajların validasyonları, hata alındığı durumlarda detayları exception bilgisinin istemci tarafına gönderilip gönderilemeyeceği gibi.

 

Yeni bir WCF hizmeti tanımlarken ilk olarak sunulması hedeflenen fonsiyonaliteler netleştirilip ve bir contract ile duyurulur. Bu contract’ lar interface’lerin içerisine yazılırlar.

  [ServiceContract] //Contrat’ın bir hizmette kullanılacağını belirtmek için interface’in üst kısmına ServiceContract yazılır
    public interface IServiceImpl
    {
        [OperationContract] //Oluşturulan metodların service tarafından kullanılabilmesi için uygulanan etikettir.
        bool SaveData(string Val); //string tipinde bir parametre alarak gelen değeri kaydeden bir metod.
 
//XML ya da JSON formatında internet üzerinde ya da local’de veri yayınlamak istediğimizde aşağıda bulunan kodlara benzer yapılar kullanılır.
        [OperationContract]
        [WebInvoke(Method = "GET",  //GET metodunun kullanılacağı belirtildi.
            ResponseFormat = WebMessageFormat.Xml, //Geriye dönen veri XML formatındadır.
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "xml")]      //Url’de bu metodun çağırılmasını sağlayacak string
        List<Employee> XMLData();       //Geri dönüş tipi ile birlikte Metod ismi.
    }

 
//Belirtilmiş olan kontratlara uygun metodlar class içerisine yazılır.
namespace MyService
{
    public class ServiceImpl : IServiceImpl
    {
        public bool SaveData(string val)  //interface içerisinde tanımlanan servis kontratı.
        {
            return true;
        }
 
        public List<Employee> XMLData()//interface içerisinde tanımlanan XMLData servis kontratı
        {
            return new List<Employee>();           
        }
   }
}

 

Proje içerisinde bulunan app.config/Web.config sayfaları içerisinde kullanılacak kontratlar endpoint’ ler içerisinde tanımlanır ve servis yayınlanmaya hazır hale getirilir.

<servicename="Services.ServiceImpl "behaviorConfiguration="ServiceBehaviour">
       <endpointaddress=""binding="webHttpBinding"contract="Services.IServiceImpl "behaviorConfiguration="web">
        </endpoint>
     </service>xm

     

Endpoint ile servisi hangi adres, protokol ve kontrat ile yayınlayacağımızı belirtmekteyiz.  Bu kullanım hizmet sınıfını birden fazla kontrat ile farklı farklı adres ve protokollerle yayınlayabilme olanağı sağlamaktadır.