WCF’e Giriş

   .Net framework 3.0 ile hayatımızın bir parçası olan Windows Communication Foundation (WCF) hakkında yazmayı düşündüğün makalelerden bu ilkinde öncelikle birlikte WCF hizmetlerine ısınmamızı hedefliyorum, hedefim sizleri fazla da yormadan kolayca nasıl bir WCF hizmeti oluşturabileceğinizi paylaşmak.

   En temel anlatımıyla Windows Communication Foundation, .Net framework 3.0’ın çıkartılmasıyla birlikte hayatımıza giren ve .Net framework ile yazdığınız uygulamaların iletişim katmanı olmayı amaç edinen bir kütüphanedir. .Net Remoting, XML Web Servisleri, MSMQ, Net pipe, tcp/ip gibi pek çok farklı yöntemi tek bir çatı altında topladığını bilmek bile ne denli güçlü olduğunu anlamanıza yetecektir.



  WCF hizmetleriyle çalışacaksanız öncelikle işin ABC’sini öğrenmelisiniz. WCF hakkında okuyabileceğiniz pek çok farklı giriş makalesinde de duyacağınız bu ABC benzetmesi, bir şaka olmaktan öte gerçekten de WCF’in ana bileşenlerini anlatan bir kısaltmadır. Peki bu kısaltma neyi ifade etmekte?

  • Address (Adres) : Eğer insanların/uygulamaların kullanacağı bir hizmet tanımı yapıyorsanız tabiki bu hizmetin belirli bir adresi olmalı, aynı iş yerlerinin/mağazaların olduğu gibi. Hizmetim intranet/internet üzerinde hangi adreste bulunmakta? İlk harfimiz A bunu temsil etmektedir.
  • Binding (Bağlayıcı) : Her bir WCF hizmetinde mutlaka yayınladığınız hizmete veri göndermek ya da hizmetten veri almak için uygulamalarca kullanılacak olan bir iletişim protokolünüz olmalıdır. Hizmetimle ne şekilde konuşulacak? ikinci harfimiz B bunu temsil etmektedir.
  • Contract (Kontrat) : Yayınladığınız her bir WCF hizmetinde kullanıcılarınıza sunmayı tahahüt edeceğiniz bir takım fonksyonaliteler bulanacaktır. Gerçek hayatta olduğu gibi sizin ve müşterilerinizin sorumluluklarının tanımlandığı ve taraflarca üzerinde anlaşılan bir kontrat bulunmalıdır. WCF hizmetinizde tanımladığınız bir kontratla, sunduğunuz fonksiyonalitelerinizde kullanıcılardan beklediğiniz değerler ile bu değerler neticesinde kullanıcıya vermeyi tahahüt ettiğiniz sonuçları belirtebilirsiniz. Hizmetim kullanıcılara hangi fonksiyonaliteleri sunacak? Üçüncü ve son harfimiz C bunu temsil etmektedir.

   WCF’in ABC’sini özetlemek gerekirse; bir wcf hizmeti tanımında 3 temel soru yanıtlanmalı; nerede? (Adres), nasıl? (Bağlayıcı), ne? (Kontrat)

   Oluşturacağınız bir WCF hizmeti, arkaplanda hangi yöntemi/teknolojiyi kullanıyor olursa olsun mutlaka ve mutlaka yukarıda sıraladığım bu üç temel bileşene sahip olmalıdır. İsterseniz örnek bir hizmet üzerinde bu üç kavramı tanıyalım;

   Yeni bir WCF hizmeti tanımlarken ilk önce sunmayı hedeflediğiniz fonsiyonaliteleri netleştirmeli ve bir kontrat ile bunu duyurmalısınız. Sunumlarıma katıldıysanız bunu bende sık sık duymuşsunuzdur; C# dünyasında ne zaman bir kontrattan bahsetsem aklınıza ilk olarak arayüz (interface) gelmelidir. Aşağıda, yazımın devamında birlikte oluşturacağımız ilk WCF hizmetimize ait örnek bir kontrat bulabilirsiniz.

public interface IOrnekHizmet {
   int Say();
}

   Gördüğünüz gibi çok basit ve sade bir kontratımız var. Her çağrıda, hizmet içerisinde tutulan sayacın değerini bir arttıracak olan bir fonksiyonalite sunmaktayım. Kontratımı bir WCF hizmetinde kullanabilmek için ufak bir iki dokunuş yapmalıyım;

  • Öncelikle kontratımın bir hizmette kullanılacağını belirtmeliyim. Bunun için sınıfımın hemen üstünde bir ServiceContract özniteliği tanımlamam yeterli.
  • Bu adım ardından, sunduğum fonsiyonaliteyi belirtmeliyim. Bunu da benzer şekilde ilgili fonksiyonun üzerine OperationContract özniteliğini koyarak kolaylıkla yapabilirim.

   Bu iki özniteliğinde kodumuza eklenmesi ardından arayüzümüz aşağıdaki şekli alacaktır;

[ServiceContract(Namespace = "http://www.enterprisecoding.com/WCFOrnekleri")]
public interface IOrnekHizmet {
    [OperationContract]
    int Say();
}

   ServiceContract özniteliğinde Namespace parametresi ile belirttiğimiz isim uzayı bize kontratın neresi için tanımlı olduğunu belirtecektir. Bu sayede farklı yazılım geliştiricilerce yazılmış olan birbirinden bağımsız WCF hizmetlerinin, aynı isme dahi sahip olsa, birbirinden ayırt edilebilmesi sağlanmaktadır. Her ne kadar opsiyonel olan bu parametreye bir değer verilmemesi durumunda framework varsayılan olarak http://tempuri.org/ değerini kullansa da, tavsiyem mutlaka kendinize özgü bir değer vermeniz olacaktır. Tamamen farazi olan ve varlığı uygulamalarca kontrol edilmeyen bu adres, kimi kullanımlarda hizmete ait dokümanların bulunduğu gerçek bir adreste olabilmekte. Bu durumda kullanıcı hızlıca hizmet dokümantasyonuna da ulaşabilecektir. Örneğin; yukarıdaki kod parçacığı için http://www.enterprisecoding.com/WCFOrnekleri/ adresine basit bir dokümantasyon eklenerek hizmet anlatılabilir.

  Kontratın tanımlanması ardından, asıl işi yapacak olan hizmetimizi tanımlamalı ve kontrat doğrultusunda gerekli tanımlamalarımızı yapmalıyız. Aşağıda IOrnekHizmet  için örnek bir hizmet tanımını bulabilirsiniz;

internal class OrnekHizmet : IOrnekHizmet {
    private int sayac = 0;

    #region IOrnekHizmet Üyeleri

    public int Say() {
        return ++sayac;
    }

    #endregion
}

   Gördüğünüz gibi hizmetim sadece her Say denildiğinde içeride tuttuğu özel değişkenin (sayac) değerini bir arttırarak istemciye dönmektedir. OrnekHizmet sınıfı içerisinde WCF hizmeti ile ilgili herhangi bir tanımlama bulunmadığı dikkatinizi çekmiştir. Gerekli olan tüm tanımlamaların arayüzümün üzerinde bulunması nedeniyle böyle bir ihtiyaç bulunmamaktadır. Bunun avantajları;

  • Aynı kontrata uyan (aynı arayüzü uygulayan) birden fazla hizmet için ortak değişiklikleri bir kez yapabilir
  • Bir hizmet sınıfı farklı arayüzleri, yani farklı hizmet tanımlarını/kontratlarını, destekleyebilir. Bu hizmet tanımları da farklı farklı adres ve protokollerden kullanıcılara sunulabilir

   İleri düzey kullanımlarda hizmet sınıfı üzerinde de ek tanımlamalar yapılabilmektedir, bu makalenin konusu olmaması nedeniyle detayına girmemekle birlikte bu konuya ilerleyen makalelerimde değinmeye çalışacağım.




   Hizmetimizin kontratını hazırlayarak, bu kontrata uygun da bir hizmet sınıfı oluşturmamız ardından artık uygun bir adres ve bağlayıcıyı kullanarak WCF hizmetimizi sunabiliriz. WCF’in en güzel yanlarından birisi basit işlerimizi bir kaç satırlık kod ile halledebiliyor olmamızdır, pek çok senaryoda uygulamamızın app.config dosyasında WCF hizmet yapılandırmamızı rahatlıkla yapabiliriz. Aşağıda sizlerle paylaştığım app.config dosyasında örnek WCF hizmetimizi kod yazmadan nasıl yapılandırabileceğinizi görebilirsiniz;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service
        name="Com.Enterprisecoding.WCF.Ornek.OrnekHizmet"
        behaviorConfiguration="metaVeriDestegi"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1234/WCFOrnekleri" />
          </baseAddresses>
        </host>
        <endpoint
          address="OrnekHizmet"
          binding="wsHttpBinding"
          contract="Com.Enterprisecoding.WCF.Ornek.IOrnekHizmet"
        />
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaVeriDestegi">
          <serviceMetadata httpGetEnabled="true"  httpGetUrl=""/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

   WCF hizmet yapılandırmamız configuration -> system.serviceModel düğümü altında yer alan iki ana gruptan oluşmakta; hizmetlerimizi tanımladığımız services ve davranışlarımızı tanımladığımız behaviors. Uygulamamız içerisinde oluşturacağımız her bir WCF hizmeti için services düğümü altında bir service girdisi bulunmalıdır. Bir service düğümünün hangi hizmet için olduğu ise name özelliği içerisinde hizmet sınıfının tam adının (namespace + sınıf adı) verilmesi ile anlaşılacaktır. Tanımlanan hizmete ait davranış bilgilerine ise behaviorConfiguration özelliği ile atıfta bulunabiliriz. Burada unutulmaması gereken nokta behaviorConfiguration ile adı belirtilen davranış yapılandırmasına dair behaviors altında mutlaka bir girdi bulunmalıdır. Hizmet tanımları ile davranışların farklı iki düğüm altında tanımlanması bize birden fazla hizmet tanımında aynı davranışları kullanabilmek kolaylığını sunacaktır.

   Yukarıdaki WCF hizmet yapılandırmamızda baseAddresses düğümü altında hizmetimizin hangi temel adreslerden yayınlanacağını belirtmekteyiz. Servisimiz farklı protokoller için farklı temel adreslere sahip olabilir, hizmetimiz çalışmaya başlarken bu temel adreslerden kullandığımız protokole uygun olanını seçecektir. Sadece http protokolü kullanan bir yapılandırmamız olduğu için örneğimizde http://localhost:1234/WCFOrnekleri temel adresi tanımlanmıştır. Aşağıda ise http ve netTcp için iki farklı temel adresin nasıl tanımlanacağına dair bir yapılandırma parçacığı bulabilirsiniz;

<baseAddreses>
    <add baseAddress="net.tcp://localhost:1234/WCFOrnekleri/YerelAg"/>
    <add baseAddress="http://localhost:1234/WCFOrnekleri/Internet"/>
</baseAddreses>
<endpoint
       address="OrnekHizmet"
       binding="netTcpBinding"
       contract="Com.Enterprisecoding.WCF.Ornek.IOrnekHizmet"
    />
<endpoint
       address="OrnekHizmet"
       binding="wsHttpBinding"
       contract="Com.Enterprisecoding.WCF.Ornek.IOrnekHizmet"
    />

   Örnek yapılandırmamızda endpoint düğümü ile hizmetimizi hangi adres, protokol (bağlayıcı) ve arayüz (kontrat) ile yayınlayacağımızı belirtmekteyiz. Bu yapılandırma şekli bize bir hizmet sınıfını birden fazla kontrat ile farklı farklı adres ve prokollerle yayınlayabilme şansını vermekte. Aşağıda WCF hizmetleriniz için kullanabileceğiniz öntanımlı binding’leri bulabilirsiniz;

  • BasicHttpBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding
  • NetTcpBinding
  • NetNamedPipesBinding
  • NetMsmqBinding
  • NetPeerTcpBinding
  • MsmqIntegrationBinding
  • BasicHttpContextBinding
  • NetTcpContextBinding
  • WebHttpBinding
  • WSHttpContextBinding

   Dikkat ettiyseniz örneğimizde IMetadataExchange kontratı ve mexHttpBinding protokolü ile mex adresinden yayınlanan ikinci bir hizmetimiz bulunmakta. mexHttpBinding bize http üzerinden WS-MetadataExchange (WS-MEX) iletişimi yapabilme olanağı sunacaktır, bu da istemcilerin servisimize bağlanacak vekil (proxy) sınıflar oluşturmalarında yardımcı olacaktır. mexHttpBinding, wsHttpBinding’in çalışmasını engelleyen ya da eklenmesi zorunlu bir protokol olmadığından ihtiyaç olmadıkça yapılandırmanıza eklemenize gerek bulunmamakta.

   Örnek yapılandırmamızın son bölümünde yer alan behaviors düğümü ile hizmetimizin davranışları tanımlanmaktadır. Örneğimizde bu başlık altında sadece servis meta verisinin yayınlanması için bir davranış eklenmiştir. Yapılandırmada kullanılan httpGetEnabled özelliği Http protokolü üzerinden GET yönetimi kullanılarak meta verinin sorgulanıp sorgulanamayacağını belirlemektedir. Bu davranışı eklemeniz ardından hizmetinize bağlanmak üzere vekil sınıflar üretmek isteyen bir yazılımcı hizmet adresinizin sonuna ?WSDL ekleyerek hizmet şemanıza erişebilir (örneğin; http://localhost:1234/WCFOrnekleri?wsdl). İstemci ve sunucu kodlarının sizin tarafınızdan yazıldığı senaryoda bir güvenlik açığı oluşturmamak adına bu davranışı eklememenizi tavsiye ederim. Bu şekilde hizmetinizde sunduğunuz fonksiyonaliteler 3. parti kişilerce sorgulanamayacağından hizmetinize saldırı ihtimalinizi düşürmüş olursunuz.

   WCF hizmet yapılandırmamızı app.config dosyası içerisinde yaptıktan sonra işimiz oldukça kolaylaşmakta. Yapılandırma sonrasında geriye bir tek uygulamamız içerisinden hizmetimizi başlatmak kalıyor. Aşağıda hizmetimizi nasıl başlatıp sonlandırabileceğinizi bulabilirsiniz;

var hizmetSunucusu = new ServiceHost(typeof(OrnekHizmet));
hizmetSunucusu.Open();
.
.
.
hizmetSunucusu.Close();

   Bu kod parçacığının ilk satırında OrnekHizmet türü için bir hizmet sunucu oluşturuyoruz. Hizmet sunucumuz başlarken ihtiyaç duyduğu yapılandırma bilgisini app.config içerisinde arayarak tam tür adının (Com.Enterprisecoding.WCF.Ornek.OrnekHizmet) geçtiği service düğümü içerisindeki bilgileri kullanacaktır.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

46 yorum

  1. Demir YASİN ORUÇ   •  

    Öncelikle merhaba, blogunuzu yeni takip etmeye başladım ve içerik açısından da gerçekten iyi şeyler bulunuyor, ancak konu wcf olduğunda nerede bir makale veya herhangi bir kaynak okursam okuyayım wcf konusunda pek emin olamadığım şeyler mutlaka oluyor :)…
    sanalkurs isimli site de wcf için şöyle bir tanım kullanılmış “Öncelikle Wcf nedir?
    Bir webservistir, web servislerin kullanım mantığı ise masa ütünden web sitemizde çalışması gereken kodları çalıştırabilmektir. Örneğin winapi’mizde login işlemimiz var ama kullanıcı adı ve şifremiz web de ki veri tabanımızda. Bir sitedeki veri tabanına ulaşmak istiyorsak o site içinden kodlama yapmalıyız. Web servisimiz işte tamda bu işe yarıyor. Servisimizi yazıyoruz ve sitenin içine koyuyoruz. Daha sonra winapi’mizden bu servisi çağırıyoruz ve servis internette çalışarak bize istediğimiz sonucu veriyor. Kullanıcı adı ve şifreyi servisimize parametre olarak yollayıp , sonucu true ve false olarak alabiliriz.” bu tanım doğru veya yeterli midir? Ben ne zaman wcf konusunu düşünsem bunun genel de güvenlik amaçlı yapıldığını düşünüyorum (dar kafalı bir bakış açısı olabilir, ki sorumu da ufkumu genişletmek için soruyorum 🙂 ) ve onun haricinde de uygulamalar arasında ki iletişim için de rahatlık ile kullanılabilecek bir teknoloji olarak görüyorum (eminim de öyledir), genel de makaleler veya görsel eğitim gibi materyaller de herkesin anlayabileceği bir seviyeye inilmediğini düşünüyorum, az çok kendim de başkasına bir şey anlatırken konuya olan hakimiyetimden ötürü karşımda ki kişinin de beni anlayabileceğini düşünüp aynı hataya düştüğüm için böyle tahmin ediyorum hiç olmazsa, sorun şu ki, biz bu wcf’i örneğini verdiğim metin dışında nerede ve neden kullanmalıyız, bir de her yerde “dağıtık mimari uygulamaları” gibi bir kavram geçiyor ki google da arattığınızda dahi adam akıllı bir sonuç bulamıyorsunuz (maalesef ingilizce bilmediğim için yabancı kaynaklara olan başvurum da genel de sıkılma ile sonlanıyor 🙂 ) bu yüzden dağıtık mimarinin de ne olduğunu açıklarsanız çok sevinirim (tahmin ettiğim kadarı ile uygulamayı farklı ortamlarda tek bir uygulama gibi çalıştırmak diye düşünüyorum ama yine de daha geniş/doğru bir bilgiye hayır diyebileceğimi sanmıyorum 🙂 )…
    Şimdiden teşekkür ediyorum, hiç olmazsa paylaşımlarınız için…

    • Fatih Boy   •     Yazar

      Merhaba,
      WCF ile ilgili az çok bilgi sahibi olan pek çok insanın düştüğü bir hatayı düzeltmek isterim; WCF bahsettiğiniz kaynakta geçtiği üzere sadece webservis değildir. Windows Communication Foundation, adından da anlaşılabileceği gibi, .Net üzerine kurulu bir iletişim kütüphanesidir. Tabi ki günümüz popüler trendlerinde iletişim denince haklı olarak akla web servisler, daha da spesifik olacak olursak, xml web servisler gelmekte; fakat xml web servisleri WCF kütüphanesiyle yapabileceklerinizden sadece bir kısmı. WCF ile oluşturduğunuz bir xml web servisi, kodunuzu değiştirmeden, sadece yapılandırma dosyasına müdahale ederek TCP/IP üzerinde ve soket seviyesinde iletişim sağlayan bir hale kolaylıkla dönüştürebilirsiniz. Hatta aynı kodu isterseniz kolaylıkla Microsoft Message Queuing (MSMQ) üzerinde çalışabilir hale bile getirebilirsiniz.

  2. Celal   •  

    Google ın dediği gibi genelde servisler dağıtık mimariler için kullanılmaktadır.Bu da şu demek oluyor.Elinizdeki verileri başka bir firma ile paylaşmalısınız ki yüklenici diğer firma o veriler ile işinizi yapsın.Bunu yapmanız için database inizi yüklenici firma ile paylaşamayacağınıza göre bu verileri servis üzerinden diğer firmalar ile paylaşırsınız.Ayrıca bu şekilde database ile olan bağlantı yolları hem elinizde olur.Hemde database deki yükü indirgeyerek performans kazanımı sağlarsınız.Daha detaylı faydaları vardır muhakkak ama aklıma gelenler bunlar.

  3. serdar   •  

    wcf hakkında güzel bir anlatım şu ana kadar bulamadım heleki burak selim şenyurt un videosuna baktım uykum geldi 10.dk da kapadım.Önemli olan bir konuyu çok iyi bilmek değildir., onu karşı tarafa güzel bir şekilde anlatmaktır yada hayattan kısa kısa örnekler vermek dahada anlatımı basit hale getirir
    açıkcası sizinkinden de bir şey anlamadım çünkü wcf tanımı için yaptığınız tek açıklama

    Net framework ile yazdığınız uygulamaların iletişim katmanı olmayı amaç edinen bir kütüphanedir
    budur..

    iyide peki wcf nedir, neye yarar bence daha basit anlatım olabilirdi

    profesyonel anlatım altında herkesin yaptığı hata özellikle b.selim şenyurt ve sefer algan uppppuzun yazıyorlar ama içinden 10 cümle anlıyorsunuz, aynı konuyu dandik dundik bir sitede 10 satırda anlayabiliyorum.Lütfen hiç bilmeyen insanları göz önüne alıp makalaleri basit anlatımla yapın
    2 tür anlatım var

    1 karşı tarafın anlayacağı tarz
    2 sizin kendi anladığınız tarz
    ve herkesin anlaması kendinizinki gibi olamaz umarım kırıcı olmadım

    • Fatih Boy   •     Yazar

      Merhaba Serdar,
      Her ne kadar makalemin birincil hedefi WCF’in ne olduğu anlatmaktan öte hızlı ve basit bir şekilde ilk WCF hizmetimizi yapabilmek, temel kavramlarını anlatabilmek olsa da size bir şey katamamış olmasına üzüldüğümü belirtmek isterim. Benzer şekilde Burak Selim Şenyurt ve Sefer Algan gibi değerli insanların zamanlarını ayırarak, emek vererek yaptıkları paylaşımların size faydası olamaması tabi ki üzücü. İnternet üzerinden bu konudaki açığınızı kapatabilecek bir kaynak bularak kendinizi geliştirebilmenizi ve bizler gibi sizin de kazanımlarınızı insanlarla paylaşabilmenizi umuyorum.

      • Oktay   •  

        Bence anlatımınız güzel ve anlaşılır. Sizi diğerlerinden ayıran şey profesyonel olmanız. Basit anlamda anlatan bir sürü site var zaten.

  4. Tomcat   •  

    Bu konuların anlaşılabilmesi için öncelikle biraz c# bilgisi gerekiyor sanırım, Interface,abstrac,design pattern vesair gibi kelimelerin sözlük anlamından ziyade kullanımları ve kullanım amaçlarını bilmeleri gerek.Eğer bir makale okuyup son derece gelişmiş bir wcf servisi yazmak bu kadar kolay olsa idi herkes yazılımcı olurdu..Toplum olarak herşeyde olduğu gibi yazılım alanında da kolaycılığa kaçıyoruz..Herkese sevgiler

  5. serdar   •  

    Fatih hocam anlatımınız harika ve çok çok rica ediyorum, şu wcf konusuna bir el atın çünkü sizin anlatımınız la wcf konusunda müzdarip olan herkes aydınlancaktır, wcf ve wcf güvenlikle ilgili türkçe makale yok denecek kadar az wcf güvenliği a-z ye anlatan bir videonuz yayınlarsanız çok seviniriz teşekkürler

  6. dhmm   •  

    Hocam ben c# ta yeniyim… Lakin su WCF konusu hakkinda kisacasi soyle tarif edilebilir diye dusunuyorum…. Windows isletim sistemlerinin kullandigi teknolojilerlerle iletisime gecebilmek icin uygulamaya koyulmus bir ara dil… C# wcfi kullanarak mesela MSMQ kullanabiliyor…
    Eskiden compiler yazdigimiz kodu direkt makine diline ceviriyorduya… artik CLR var… Buda ona benzer birsey…

    Yani eskiden c++ ile anamiz agliyordu simdi ise bir o kadar kolay oldu c# ve wcf sayesinde….

    Yanlisim varsa duzeltin lutfen….

    Calismalarinizda basarilar

    • Fatih Boy   •     Yazar

      Merhaba Dhmn,
      WCF için kabaca .Net dillerince kullanılabilecek ortak bir iletişim katmanı, bir kütüphane dememiz sanırım yanlış olmayacaktır. Gördüğüm en yoğun kullanımı olan web servislerini bile ele alacak olursak sadece Windows işletim sisteminin kullandığı teknolojilere yönelik demek büyük bir haksızlık olacaktır.

  7. dhmm   •  

    Pardon WCF bir teknolojidir “bir dildir demisim” 😀

  8. serdar   •  

    bence buraya boşuna yazılıyor ,cevaplanmayan yazılar

    • Fatih Boy   •     Yazar

      Merhaba Serdar,
      Bu olumsuz yorumuna rağmen, daha önceki yorumundan sonra bile bu sayfayı tekrardan ziyaret ediyor olmana sevindim 😉 Geçen zamanda bilgi paylaşımı konusunda bizlere bir katkıda bulunamamış olmana rağmen, bu eleştirel yaklaşımından dolayı, çok yakında senin de yazılarını görebileceğimiz izlenimine kapılıyorum. Umarım senin için olan bu beklentilerimize yanıt verebilirsin.

  9. Sinan   •  

    Elinize sağlık hocam böyle makalelerinizin devamını bekliyoruz :):):)

    Benim sormak istediğim bu platform bağımsız olması güzel de benim c#’a özgü yazmış olduğum kodlar veya şöyle diyeyim c#’a özgü kullanmış olduğum değişkenler ile servislerden geri dönüş yaptığımda diğer platformlar bu geri dönen değeri nasıl kullanabilecekler kafamı şimdiden sanırım karıştıran bu oldu . Eğer diğer platformlar tarafından karşılanamayacaksa servisimin dönen değeri o zaman demek oluyor ki geri dönüşlerde c#’ a özgü parametreleri değil de kalıplaşmış bütün platformlar tarafından kullanılan geri dönüş değerleri gönderilmelidir bunun hakkında bilgi verirseniz sevinirim.
    Kolay gelsin.

    • Fatih Boy   •     Yazar

      Merhaba Sinan,
      Gerçekten de önemli bir konuya değindin. WCF’in en yoğun kullanıldığı alan olan web servisler, doğaları gereği platform bağımsızlığı göz öüne alınarak tasarlanmalıdırlar; ama üzülerek söylemeliyim ki iş hayatında edindiğim tecrübelerim gösteriyor ki pek çokları bunu göz ardı etmekte. Özellikle pek çok farklı istemcinin bağlanacağı önemli devlet projelerinde giden/gelen veri içerisinde C#’a özgü olan (örneğin; DataSet) veri türlerinin kullanılması üzücü. Çünkü böylesi veri türlerinin diğer programlama dillerinde oluşturulup gönderilebilmesi hep bir problem olmuştur. Bu durumda da herkesi entegre olabileceği bir web servisinden bahsetmek mümkün olmayacaktır. DataSet kullanımındaki bir diğer problem ise web servis tanım dosyasında (WSDL) dataset içerisinde beklenen alanlar ve veri türleri hakkında bir bilgi bulunmamasıdır. Bu durumda istemci ile aranızdaki kontrat dediğimiz WSDL içerisinde tam ve açıkça ne istediğinizi belirtmiyor oluyorsunuz…

      • engin   •  

        Platform bağımsızlığı korunarak hazırlanan WSDL yapıları ciddi performans kayıplarına ve benzeri dolaylı işlemlere neden açmakta;

        ürün\özellik()\değer

        gibi bir nesne modelinde her farklı değer tipinin aktarılması mümkün olmadığı durumda özellik değerleri için ayrı çağrılar yapılması ve her tip için ayrı çağrı paketleri oluşturulması gibi.

        bu ve benzeri durumlar için iyi bir çözüm var mı?

        • Fatih Boy   •     Yazar

          Merhaba Engin,
          Böylesi bir durum kesinlikle söz konusu değil. Gerek WCF tasarımı gerekse de XML web servis spec.’leri böylesi bir duruma izin vermekte.
          Böylesi bir tasarımda servinden dönebilecek tüm veri türlerini tanımlamış olman şart, ardından tek yapman gereken dönebilecek bu veri türlerini wsdl dokümanınla tüm kullanan taraflara açıklaman. WCF kullanıyorsan bunun için tek yapman gereken KnownTypeAttribute özniteliği ile tanımlamak olacaktır.

  10. Sinan   •  

    Anladım Hocam Teşekkür ediyorum hızlı cevabınız için.
    Ben bir HBYS firmasındayım bakanlık bu aralar WCF ile ilgili bir kaç servis yazdı ondan bende wcf’i araştırdım servisleri kullanacak seviyeye geldim ve kullanıyorum şu an ve dediğiniz problemler oluyor bazen sanırım baya bir şikayet var çünkü…
    Ben Şuan servis yazmaya çalışıyorum Fatih Hocam ilerleyen zamanlarda servisler ile ilgili sorunları paylaşmak istiyorum sizden de destek bekliyorum.
    Teşekkür ediyorum iyi günler

  11. Arif KÖMÜRCÜLER   •  

    Merhabalar
    Acil olarak wcf ile transaction yapma konusunda yardıma ihtiyacım var.
    wcf içerisinde transaction sız bir fonksiyon tanımlayıo oracle bilgi aktara biliyorum. Fakat ayni kodu transactionlu yapmaya çalışdığımda aşağıdaki hatayı alıyorum

    Hata : Unable to load OraMTS * Oracle.DataAccess.Client.OracleException Unable to load OraMTS
    konum: Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
    konum: Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
    konum: Oracle.DataAccess.Client.OracleConnection.Open()
    konum: WcfServiceLibrary1.Service1.IsimEkle2(String isim) c:\users\komurcu\documents\visual studio 2010\Projects\WcfServiceLibrary1\WcfServiceLibrary1\Service1.vb içinde: satır 65

    bu sorun nerden kaynaklana bilir.
    bana yardımcı olabilirmisiniz.

    Teşekkür ederim.

    • Fatih Boy   •     Yazar

      Merhaba Arif,
      Senin örneğin için; WCF servisleri içerisindeki bir transaction’ın dışarıdan yönetilebilmesini sağlayacaksan sistem arkaplanda Microsoft Transaction Server’ı (MTS) kullanacaktır. Bu durumda Oracle transaction’larının da yönetilebilmesi adına “Oracle Services for Microsoft Transaction Server” bileşeni de kurulu olmalı. Öncelikle bu bileşenin kurulu olup olmadığını kontrol etmeni tavsiye ederim.

  12. Erhan   •  

    Merhaba Fatih hocam ben WCF servisinde Generic method kullanmak istiyorum .
    [ServiceContract]
    public interface ISettingApp
    {
    [OperationContract]
    T SelectByID(short id);
    }

    public class Application : ISettingApp
    {

    public T SelectByID(short id)
    {
    return ((T)(dynamic)(SettingManager.SelectByID(id)));
    }
    }
    Yukarda belitdiğim gibi bir servis yazdım ama debug etmek istediğimde aşağıda belitdiğim hata mesajını alıyorum.
    Bu yöntemi seçiyor olmamın sebebi, işlemlerde hata olmaz ise tanımlamış olduğum nesneyi return etmek olası bir hatada ise kendi yazdığım hata nesenesi veya exception nesnesini return etmek ama henüz istediğimde başarılı olamadım.
    Çünkü :Type ‘T’ cannot be exported as a schema type because it is an open generic type. You can only export a generic type if all its generic parameter types are actual types.
    Yardımcı olursanız mutlu olurum ,okuduğunuz için teşşekür ederim iyi çalışmalar.

    • Fatih Boy   •     Yazar

      Merhaba Erhan,
      Hata mesajı generic veri türünün bir XML Web servisinde wsdl ile dışarı açılamayacağını belirtmekte. Aslına bakarsan yapılabiliyor olsaydı da bu durum XML Web servislerinin doğasına aykırılık oluşturacaktı.
      Xml web servisleri farklı farklı programlama dillerinin/teknolojilerin birlikte çalışabilmesi, birbiriyle kolaylıkla iletişim kurabilmesi adına ortaya çıkmışlardır ve daha en başından tarafların birbirlerine hangi hizmeti sunduklarını belirtmelerini ister. İşte tarafların birbirlerine sundukları bu hizmetleri belirttikleri “kontrat“lar wsdl dokümanlarıdır. İçerisinde hangi servislerin hangi formatta veri kabul ettiği ve ne yanıt verebileceği belirtilmektedir. Senin örneğin için bu temel yapı taşına tamamen aykırı bir tasarım görüyorum. Dışarıya açtığın hizmetin neler geri dönebileceğine dair en ufak bir bilgi vermemek istiyorsun bir bakıma. Böylesi bir yaklaşım yerine normalde döneceğin değeri belirtmen, ek olarak hata olması durumunda dönebileceğin hata sınıflarını, yanı fault mesajlarını, belirtmen daha doğru olacaktır.
      Dönebileceğin hataları da wsdl dokümanında/”kontrat”ında belirtebilmek adına FaultContractAttribute özniteliğini kullanabilmek mümkün. Bu sayede servisini kullanmak isteyenlere şu veriyi alır, bu veriyi dönerim dedikten sonrada hata olması durumunda ise şu şekilde bir sınıfla hata bilgisini iletirim demiş olacaksın.

  13. Erhan   •  

    Teşekkürler Fatih hocam elinize sağlık,
    bir sorum daha var. Ben Boxing and Unboxing
    yapmak istiyorum, dynamic veya object return etmek istediğimde WCF servislerimde methodum kırmızı(!) işareti ile işaretlenmiş oluyor yani kısaca WCF servislerinde object veya dynamic return
    etmek XML Web servislerinin doğasına yine aykırılık mı oluşturacak?

  14. nuri   •  

    Fatih hocam WCF i yeni araştıran biri olarak makaleyi anlamakta zorlansamda sorulara vermiş olduğunuz cevaplar bile kafamda bişeyler oluşturdu. Emeğinize sağlık teşekkürler..

  15. Pingback: WCF’e Giriş için Türkçe Kaynak « PHPAX

  16. Aşkın   •  

    Teşekkür ederim iyi bir makale olmuş. Ayrıca başarılarınızın devamı dilerim.

  17. ümit   •  

    İtiraf etmeliyim ki yapılan yorumlardaki bilgiler konuyu daha iyi anlamamı sağladı…Her yoruma cevap vermeniz çok iyi olmuş fatih hocam..emeğinize sağlık

  18. Burhan ERSOY   •  

    Fatih hocam selamlar,

    Makaleniz için çok teşekkür ederim. Çok işime yaradı. Şimdi bu konuyla ilgili bir soru sormak istiyorum.

    Ben WCF i ASP.NET ‘te kullanıyorum.

    ConcurrencyMode = Multiple,
    InstanceContextMode = PerSession

    kullanıyorum.

    Ayrıca IsInitiation=true olarak tek bir metodum var.

    Şimdi hocam sorum şu :
    WCF nesnesini, asp.net ‘te nasıl create edeceğim ki, bütün sayfalarda oluşturduğum bu tek nesneyi kullanayım.
    Static olarak tanımlarsam, diğer kullanıcılarda aynı kanaldan giriş yapıyor. Ben her bir session ‘un ayrı bir nesne create etmesini istiyorum.

    Bilemiyorum anlatabildim mi?

    Yardımlarınız için çok teşekkür ederim.

    • Fatih Boy   •     Yazar

      Merhaba Burhan,
      ASP.Net session’ları ile WCF session’ları hep karıştırılan iki kavramdır. Gerçekte ikisi tamamen farklı iki şeyi ifade etmekte;

      * WCF oturumları (session) tam olarak bir nesne örneğine denk gelmektedir. Yani InstanceContextMode = PerSession şeklindeki bir ifade ile her bir oturum için bir servis nesnesi oluştur demiş oluyorsun. Farklı bir istemciden gelen bir istek için yeni bir nesne oluşturulacak; fakat aynı istemciden gelen ardıl isteklerde hep aynı nesne kullanılacaktır.
      * ASP.Net oturumları (session) ise daha çok bir ortam kullanılan bir alan olarak düşünülmelidir. Varsayılan olarak hafıza olan bu alan istenirse MSSql, Window Azure AppFabric ya da MemCache gibi 3. party sağlayıcılarda da tutulabilir.

      WCF yapısal olarak incelenecek olursa da bir isteğin karşılanmasından başlayıp işlenerek kullanıcıya geri döndüğü süreç ASP.Net sürecinden farklı ilerlemektedir. Dolayısıyla da aynı hatta gitmeyen bu iki süreçte ortak bir paylaşım alanı, ortak bir oturumdan bahsedilmesi doğru değil.

      Öte yandan WCF ve ASP.Net’in aynı süreçte çalışmasının sağlanması dolayısıyla da oturum paylaşımı da mümkün. Bunu için yapılandırma dosyasına <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> yazılarak WCF süreçlerinin ASP.Net uyumlu modunda çalışması sağlanabilir.

  19. mustafa   •  

    Fatih Hocam, ellerinize sağlık, çok güzel bir giriş makalesi olmuş, yorumlara da bakılırsa faydalı olduğu belli oluyor.

  20. Caner   •  

    Hocam merhaba öncelikle elinize sağlık güzel bir makale olmuş.

    Bir proje yapmam gerekiyor bu projede android,ios gibi platformlara veri aktarımı yapacağım wcf ile bu konuda sorun yaşar mıyım ?

    • Fatih Boy   •     Yazar

      Merhaba Caner, Android ve IOS gibi mobil platformlar soap bazlı iletişim ve özellikle de xml işleme konularında çok güçlü değildir. Buralarda daha çok json bazlı çözümler tercih edilmekte. Bu durumda wcf’i json çıktısı verecek şekilde yapılandırmanı ya da web api gibi alternatiflere yönelmeni tavsiye ederim.

  21. Mehmet   •  

    Hocam Web.Config yapılandırmasını yapamıyorum. Çok karışık geliyor orası. Dahası internette bulduğum projeleri çalıştıramıyorum. Bu Config yazımı için daha basit yöntemler yok mudur?

  22. serkan   •  

    eline sağlık hocam güzel anlatım

  23. efe   •  

    merhaba hocam, WCF i iyi anlatmışın emeğine sağlık ama,, yazdığın ve anlattığın şeylerin normal web servislerden pek te bir farkı yok. Yani bu meretin web servislerden farkı nedir. niçin bunu kullanmalıyız. bir de şu config dosyasını yapılandırmayı hiç anlamadım. O kısmı çok ileri seviye anlatmışsınız. Biraz daha basit bir anlatım olabilirdi… Tekrardan teşekkür ederim emeğiniz için..

  24. Fpinndir   •  

    Hocam teşekkür ederim uzun zamandır bu şekilde detaylı bir anlatım arıyordum emeğinize sağlık başarılarınızın devamını dilerim.

  25. aydın türker   •  

    merhaba ben netten araştırma yaparken sayfanıza geldim. ilk olarak bool,string,int gibi tipleri döndürebildim ama örneğin eski projelerimden alıştığım,”hltmTable”,”sqldatareader”, “dataset”,”datatable” de döndürebilirmiyim.? datayı entitiy ile List seklinde, istediğim gibi sorgulayıp getirebiliyorum.
    amacım, örneğin kullanıcının yetkilerini getirip tablo olarak yazdırmak veya gridcontrol e datasource olarak vermek?.
    ** wcf teki çalışan fonksiyonum şöyle(HtmlTable dönecek!);
    public Table Yetkiler(int KullaniciID)
    {
    dbTrkISGEntities ent = new dbTrkISGEntities();
    var yetkiler = from yetki in ent.sp_Web_YetkilerbyKullaniciID(KullaniciID)
    select yetki;
    List ly = yetkiler.ToList();
    Table tb = new Table();
    TableCell tc;TableRow tr;
    for (int i = 0; i < ly.Count; i++)
    {
    tr = new TableRow();
    tc = new TableCell();
    tc.Text =ly[i].FormBaşlık.ToString();
    tr.Cells.Add(tc);
    tb.Rows.Add(tr);
    }
    return tb;
    }

  26. Ali Yakup Durşen   •  

    Fatih Bey,

    Emeğinize, aklınıza, paylaşmaya açık yüreğinize sağlık.

    Artık ihtiyarlamaya başlamış bir yazılımcıya hızlıca yardımcı oldu makaleleriniz.

    Günün birinde tanışabilme dileğiyle.

  27. Pingback: WCF’e Giriş için Türkçe Kaynak | Güven Şahin

  28. reis   •  

    hoca fişeqsin ha

  29. Ali   •  

    Yorumlar en az makale kadar bilgilendirici.

    Hiç anlamadım şu dataset return etmeyi. Yani bir amaca hizmet için mi dataset return ediliyor yoksa acemilikten mi?

    • fatih   •     Yazar

      Merhaba Ali, şimdiye kadar WCF hizmetinde dataset kullanan pek çok örnek gördüm. Bu konudaki düşüncelerimi de uzun zaman önce Web servis dediğimiz ne değildir 1 makalemde paylaşmıştım. Pek çok insan, bir dataset dönerek istemciyi tamamen sunucu mantığının bir parçası olan .Net koduymuş ve bu kod sunucuda çalışıyormuş gibi yoluna devam edebiliyor. Gördüğüm, bunun daha çok işi hızlı tamamlamak adına yapıldı. Pek çoklarının da makalemde bahsettiğim durumdan haberinin olduğunu düşünmüyorum; ki bu da senin dediğin gibi acemilikten kaynaklanıyor.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir