• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Soap Bazlı WCF Servislerini REST Modeline Taşımak

.Net Framework 3.5 ile birlikte, WCF(Windows Communication Foundation) tarafına kazandırılan önemli yeteneklerden biriside Web programlama modelidir. Bu modelin getirileri arasında, WCF servislerinin REST(Representational State Transfer) tekniğine göre yazılıp, kullanılabilmesi de vardır.

01.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: WCF

4179

.Net Framework 3.5 ile birlikte, WCF(Windows Communication Foundation) tarafına kazandırılan önemli yeteneklerden biriside Web programlama modelidir. Bu modelin getirileri arasında, WCF servislerinin REST(Representational State Transfer) tekniğine göre yazılıp, kullanılabilmesi de vardır. Özellikle SOAP(Simple Object Access Procotol) bazlı WCF Servisleri ile REST modeline göre tasarlanmış servisler arasındaki en büyük fark, HTTP metodunun çeşididir. SOAP bazlı modelde istemciler proxy' ler aracılığıyla HTTP protokolünün POST metoduna göre isteklerini gönderirler. REST modeline göre tasarlanmış bir servise ise HTTP protokolünün GET metoduna göre talepte bulunulmaktadır. URL bazlı Querystring parametreleri ele alınabilir, URL Rewriting/URL Routing tarzında taleplerin istenmesi sağlanabilir(İlerleyen bir yazımda nasıl ele alındığını göstereceğim). Bu yazımızda SOAP bazlı olarak tasarlanmış bir WCF servisinin, basitçe REST modeline nasıl taşınabileceğini incelemeye çalışacağız. Öncelikli olarak elimizde aşağıdaki kod parçalarında yer alan sözleşme(Service Contract) ve tiplere sahip bir WCF Service Application' ımız olduğunu düşünelim.

Servis sözleşmemiz;

using System.ServiceModel;

namespace NorthwindServices
{   
    [ServiceContract]
    public interface IProductService
    {
        [OperationContract]
        Product GetProduct(int id);
    }
}

Uygulayıcı tip;

namespace NorthwindServices
{   
    public class ProductService
        : IProductService
    {
        #region IProductService Members

        public Product GetProduct(int id)
        {
            return new Product
            {
                 Id=id,
                 Name="Bisiklet(Hemde Kırmızı)",
                 ListPrice=10.45
            };
        }

        #endregion
    }
}

Veri sözleşmeli tipi;

using System.Runtime.Serialization;

[DataContract]
public class Product
{
    [DataMember]   
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public double ListPrice { get; set; }
}

Söz konusu servis SOAP bazlı tasarlandığı için web.config dosyasındaki system.serviceModel içeriğide aşağıdaki gibidir.

Bu servis test edilmek istenirse eğer, yine 3.5 sürümü ile birlikte gelen WcfTestClient aracı kullanılabilir. Tabi, servisin IIS veya Asp.Net Development Server üzerinden host ediliyor olması gerekmektedir. Aşağıdaki ekran görüntüsünde servisin ilgili GetProduct metodunun test edilişi görülmektedir.

Görüldüğü üzere istemci ve servis aralarında, SOAP zarflarını(SOAP Envelope) kullanarak haberleşmektedir. Eğer Fiddler gibi bir aracı kullanırsanız bu durumda HTTP Post metoduna göre bir talepte bulunulduğunu görebilirsiniz. Diğer tarafan istemcinin servisi kullanabilmesi için proxy tipinede ihtiyacı vardır. Ancak REST modeli ele alındığında ve HTTP Get ile talepte bulunulduğunda arada buna gerek yoktur ki buda her iki model arasındaki ikinci önemli fark olarak görülebilir. Şu anda yapmak istediğimiz söz konusu servisi REST modeline taşımaktadır.

İlk olarak projeye System.ServiceMode.Web assembly' ının referans edilmesi gerekmektedir. İkinci adımda ise HTTP Get metodu ile erişilmesi istenen operasyonların WebGet niteliği(attribute) ile imzalanması yeterli olacaktır.

using System.ServiceModel;
using System.ServiceModel.Web;

namespace NorthwindServices
{   
    [ServiceContract]
    public interface IProductService
    {
        [OperationContract]       
        [WebGet]
        Product GetProduct(int id);
    }
}

Bu işlem ile GetProduct operasyonunun HTTP Get metoduna göre çağırlabileceği bildirilmektedir. Peki kime?

Bir nitelik söz konusu ise eğer, bunu çalışma zamanında ele alan bir yapının olması gerekmektedir. Bu senaryoda, WCF çalışma zamanı ortamının bu niteliği göz önüne alarak, operasyona gelecek olan çağrılarda HTTP Get metodunu değerlendiriyor olması gerekir. Var olan ServiceHost fabrikası bu işlemi yapmamaktadır. Bu sebepten servise ait Markup kodları içerisinde aşağıdaki değişikliğin yapılması üçüncü adımdır.

<%@ ServiceHost Language="C#" Debug="true" Service="NorthwindServices.ProductService" CodeBehind="ProductService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Buradaki en önemli değişiklik WebServiceHostFactory fabrika tipinin kullnılıyor olmasıdır. Dolayısıyla artık ProductService.svc isimli hizmete gelecek olan HTTP Get talepleri karşılanabilecektir. Buna göre Üçüncü adımdan sonra servis bir tarayıcı uygulama yardımıyla test edilebilir. Ancak bu durumda aşağıdaki görüntü ile karşılaşılması muhtemeldir. 

Bu son derece doğaldır. Nitekim halen web.config dosyası içerisinde service ile ilişkili ayarlar SOAP modeline göre durmaktadır.(BasicHttpBinding kullandığımız hatırlayalım) İki alternatif vardır. web.config içeriğinde yer alan servis ilişkili bildirimler tamamen kaldırılabilir. Yada WebHttpBinding bağlayıcı tipinin kullanılması tercih edilebilir. Ben web.config içerisindeki system.ServiceModel içeriğini tamamen kaldırmayı tercih ettim. Buda bizim 4ncü adımımız oldu. Peki bu adımdan sonra servisi tekrar denersek...

Sonuç yine hüsran. Cry

Aslında problem servisten nasıl istekte bulunacağımızı bilmiyor oluşum. Nitekim WebGet niteliği ile imzalanmış olan GetProduct operasyonuna HTTP Get modeline göre parametre ile birlikte talepte bulunmamız gerekiyor. Aynen aşağıdaki şekilde olduğu gibi. 

Dikkat edileceği üzere /GetProduct?id=1001 ile gönderilen talep, başarılı bir şekilde servis tarafından ele alınmış ve geriye, Product nesne örneği için oluşturulan XML içeriği döndürülmüştür.

REST modeli öylesine tutuldu ki WCF 4.0 içerisinde zaten gömülü olarak daha fazla eklenti ile birlikte gelecek. (Ado.Net Data Service' leri bu modelin güzel bir açılımı olarak görebiliriz aslında)  Bu eklentileri bir süre önce CodePlex' te yayımlanan WCF Rest Starter Kit yardımıyla Visual Studio 2008 ortamı üzerinde test etmemiz ve geliştirmemizde mümkün. Hatta geçtiğimiz Mart ayında bu geliştirme kitinin 2nci versiyonuda yayınladı. REST modeli ile ilişkili olaraktan yeni yazılar eklemeye devam ediyor olacağım. Hatta Rest modeli ile ilişkili iki görsel dersimede aşağıdaki linklerden ulaşabilirsiniz.

Atom Feed Service  C#Nedir? | NedirTv?

Read-Only Collection Service C#Nedir? | NedirTv? 

NorthwindServices.rar (16,34 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 4179izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...
  • Merhaba download linki çalışmıyor. Rica et...
  • Nevzat Bey selamlar, Açıkçası bizler a...
  • Parametreleri Cache İşleminden Yalıtma kon...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 121520
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 67178
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 49422
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ