WCF Service Add Reference

98 views
Skip to first unread message

Tufan Dayi

unread,
May 23, 2013, 4:18:42 AM5/23/13
to bnr...@googlegroups.com
Merhaba,

WCF Servisleri ile ilgili bir sorum olacaktı. Bildiğiniz gibi Xml Web Servislerini (.asmx) projemize eklerden Add Service Reference > Advanced > Add Web Reference diyerek ekleme işlemini gerçekleştiriyoruz. WCF servislerinde baktığım örneklerde bazılarında bu şekilde, bazırlarında Add Service Reference kısmından direk olarak ekleniyor. Ben servisimi IIS üzerinde host edeceksem bunun doğru yöntemi hangisi olmalıdır?

WCF Service hem SOA mimarisi hemde REST mimarisi ile hizmet verebiliyor. SOA olarak kullanmak istediğim takdirde xml web service (.asmx) den endpoint özelliklerinden başka farkı nedir?

Kısacası nedir bu WCF karanlık noktaları aydınlatabilecek var mı?

Teşekkürler.

Erdem Bener

unread,
May 23, 2013, 4:32:11 AM5/23/13
to bnr...@googlegroups.com

Tufan merhaba,

 

Bildiğim kıt bilgilere göre,

 

Web servislerinde asmx uzantılı url ile referans ekleyebilirken wcf servislerinde her zaman bunu yapamayabiliyorsun.

Wcf servislerini host etmek için iis şart değil. Kendin bir host application yazıp oradan istediğin herhangi bir port ile servisi host edebiliyorsun.

Metadata publish olayı vardı hatırladığım kadarıyla. Bazı durumlarda güvenlik gerekcesiyle klasik olarak web servislerinde olduğu gibi url yazıp referans ekleyemeyebiliyorsun. Bu durumda yanlış hatırlamıyorsam svcutil ile proxy sınıflarının oluşturulmasını sağlayıp daha sonra bunları projene ekleyebiliyorsun...

 

Kısacası wcf in detaylarını öğrenmek için bence sıfırdan başlayıp ilerlemek için düzenli bir kaynak takip etmek daha doğru olur.

 

Bana hatırlatırsan sana elimde bulunan pdf ler vardı. Onları bir şekilde iletebilirim.

 

İyi çalışmalar.

--
Bu e-postayı Google Grupları'ndaki "bnr_net" adlı gruba abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için bnr_net+u...@googlegroups.com adresine e-posta gönderin.
Daha fazla seçenek için, https://groups.google.com/groups/opt_out adresiniz ziyaret edin.
 
 

Tufan Dayi

unread,
May 23, 2013, 4:47:15 AM5/23/13
to bnr...@googlegroups.com
Yanınızda değil mi hocam :)

Add Web Reference diyerek ekleyebiliyorum yani buna izin veriyor örneğin; localhost:1515/TestService.svc?wsdl

Add Web Reference demeden, add reference diyerek localhost:1515/TestService.svc olarak ekleyebiliyorum.

İki şekilde de ekleniyor. wsdl olarak eklediğimde normal olarak bilindik xml web service gibi kullanabiliyorum. Diğer türlü türetemiyorum bile :)

Doğru düzgün baştan alıp anlatan bir şeyde bulamadım eğer varsa kaynak çok sevinirim, güncel ve Türkçe olması tercihimdir :)


From: erdem...@gmail.com
To: bnr...@googlegroups.com
Subject: RE: WCF Service Add Reference
Date: Thu, 23 May 2013 11:32:11 +0300

Erdem Bener

unread,
May 23, 2013, 5:02:38 AM5/23/13
to bnr...@googlegroups.com

Türkçe yok ama kaynak çok :)

Tufan Dayi

unread,
May 23, 2013, 6:56:50 AM5/23/13
to bnr...@googlegroups.com
Acaba Bill Gates'e mail felan mı atsam bizim gruba üye olup sen anlatır mısın diye... :)

bga...@microsoft.com
bill....@microsoft.com
big...@microsoft.com

hangisi olabilir ?


From: erdem...@gmail.com
To: bnr...@googlegroups.com
Subject: RE: WCF Service Add Reference
Date: Thu, 23 May 2013 12:02:38 +0300

Abdulkadir Bener

unread,
May 23, 2013, 7:48:51 AM5/23/13
to bnr...@googlegroups.com
Selamlar;
 
Ben de acizane kıt bilgimle bir şeyler yazmaya çalışayım...
Biraz basit bir açıklama olacak kusuruma bakmayın; ama zaten bu alanlar uzun uzun meseleyi açıklamak veya tartışmak için uygun değil sanırım.
Varsayımlarım: WCF servisi metadata yayını yapıyor ve BasicHTTP binding için izin var kabul ediyorum. (Default olarak böyledir.)
IIS üzerinde veya local bir standalone uygulama içinde servisin host ediliyor olması farketmeksizin aşağıdaki adımları uyguladığınızı düşünüyorum:
 
Visual Studio içinde "Add Service Reference" diyerek web servisi ekliyorsunuzdur. İki yolu var:
 
(1)
Açılan ekranda "Address" kısmına "http://.......svc" yazarak servis eklerseniz client uygulamanızda DotNet 3.5+ WCF kütüphanelerini kullanacak bir web servisini register etmiş olursunuz. Sunucuyla konuşurken Dotnet 3.5+ kütüphaneleri çalışır. Bir kısım avantajlar elde etmiş olursunuz.
Mesela sunucudaki kodlarınızın durumuna göre HTTP veya TCP bağlantı teknikleriyle çağırabilirsiniz, çift yönlü çalışabilirsiniz, binary data gönderip alabilirsiniz vs..
Erdemin de dediği gibi sunucu tarafında ister IIS üzerinde isterseniz standalone bir exe içinde host ediliyor olabilir. Bu sonucu değiştirmez.
 
(2)
Açılan ekranda önce sol alttaki "Advanced" butonuna basarsınız, ardından açılan ikinci ekrandan da "Add Web Reference" butonu ile aynı sunucudaki aynı servisi register edebilirsiniz. Adresin sonunda ...svc?wsdl olması ya da olmaması durumu değiştirmez. Bu şekilde register işlemi yaptıktan sonra client yazılımınız sunucuyla konuşurken .Net 2.0'ın XML Web Services için hazırlanmış olan kütüphanelerini kullanır. Sunucu zorunlu olarak TCP ile konuşulacak filan denilmişse de size cevap vermez.
 
Niye türetemediğiniz hakkında fikrim yok. Kodları görsek belki yorum yapabilirdik.
Her iki tür için de türetme kodlarına basit örnekler ekliyorum:
1.Yöntem için
            ServiceReference1.Service1Client s2 = new ServiceReference1.Service1Client();
            MessageBox.Show( s2.GetData(2) );
 
2.Yöntem için örnek
            localhost.Service1 s = new localhost.Service1();
            MessageBox.Show( s.GetData(1, true) ); 
 
Sunucuda GetData metodunun içi şu şekilde:
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
 
2.yöntemde görünen ikinci parametre servisin DotNet 2.0 Xml Web Servisleri kütüphaneleriyle uyumu için otomatik eklenen ve parametrenin mevcut olup olmadığını belirten parametredir.
 
Ayrıntılar için İngilizce dökümanları öneririm.
Arzu ederseniz Microsoft'un WCF ders pdf'lerini bir şekilde paylaşmaya çalışırım (İngilizce).
 


23 Mayıs 2013 13:56 tarihinde Tufan Dayi <td...@hotmail.com> yazdı:

Tufan Dayi

unread,
May 23, 2013, 8:49:07 AM5/23/13
to bnr...@googlegroups.com
Abdülkadir hocam verdiğiniz bilgiler için teşekkür ederim,

1. Dökümanları hızlıca okuyabilecek ya da teknik ayrıntıları kaçırmayacak kadar ingilizcem olmadığı için ingilizce dökümanlardan yararlanamıyordum; fakat ingilizce için bir şeyler yapmanın zamanı artık geldi geçiyorda ileri düzeyde bilgilere ulaşabilmek için zorunlu bir ihtiyaç,

2. Bugüne kadar web servis kullanımım bildiğimiz xml web servislerinden ibaretti, bu nedenle wcf konusunu irdelerken ister istemez insan bu noktoya doğru şartlanıyor, bunu şu maddeler ile açıklamaya çalışayım;

a) WCF konusunda yaptığım denemelerden ve edindiğim bilgilerden anladığım; wcf sadece http:// ya da https:// protokolü için hizmet veren bir servis mimarisi değil. Çok yönlü bir iletişim kütüphanesi .conf dosyasından yapılacak ayarlamalar ile dilenirse http üzerinden ya da tcp protokolünden vb... şekilde erişmek mümkün... Şimdi bu noktoda sizin söylediklerinizden aklıma şu soru geliyor. "Erdemin de dediği gibi sunucu tarafında ister IIS üzerinde isterseniz standalone bir exe içinde host ediliyor olabilir. Bu sonucu değiştirmez." IIS üzerinden yayın yapmayan bir WCF servisine ben nasıl http protokolü üzerinden erişeceğim? Burada bahsi geçen standalone bir exe dediğiniz şey tam olarak nedir?

b) WCF servisini sizinde aşağıda anlattığınız iki şekilde ekleyerek denedim. Aslında, hatırlarsanız geçenlerde bununla ilgili bir şey sormuştum. WCF servisinin parametreleri içerisinde yer alan referans tipler haricindeki veri türleri için bool specified alan ekliyor, bunu neden ekliyor diye sormuştum. WCF servisini add web referance diyerek eklersem bu alanları istiyor. Eğer ben wcf servisini xml web servis gibi ekleyebiliyorsam, xml web servisi olan .asmx web servislerinden olmayan bu specified parametreler neden WCF servislerini web referans olarak eklediğimde oluşuyor?

c) Hiçbir ayarına dokunmadan yayınlanmış bir wcf servisini add service referance diyerek eklediğimizde, referans olarak eklenebiliyor; fakat kod tarafında türetip içerisindeki methodlara erişmek gibi bir şey söz konusu olmuyor. Bunun için wcf servisinin .conf dosyasında service name = "svc dosyası" ve endpoint contract = "interface" bilgilerini vermek gerekiyormuş, bunları ekledikten sonra içersindekim methodlara edişebildim ve b maddesinde belirttiğim specified alanlar bu yöntemde gelmedi. Ne değişti?




Date: Thu, 23 May 2013 14:48:51 +0300
Subject: Re: WCF Service Add Reference
From: abdulka...@gmail.com
To: bnr...@googlegroups.com

Abdulkadir Bener

unread,
May 24, 2013, 5:03:19 AM5/24/13
to bnr...@googlegroups.com
B maddesinde belirttiğiniz ek parametreler benim önceki yazımda 2.yöntem olarak belirttiğim şekilde Dotnet 2.0 ile kullanmak üzere eklediğinizde mecburen gelir, normalde gelmez.
 
Ben şahsen uzun süredir, bu WCF konusunda şöyle Adım-Adım teknikleri ve kavramları anlatan bir Türkçe kitap yazılsa satar diye düşünüyorum. bana çok soran oluyor böyle bir kitap var mı diye. Neden bizler yazmıyoruz? belki para bile kazandırır. Çeviri olmamalı, menü resimleri, ekran resimleri bol bol grafikli az yazılı ama çok örnekli bir kitap. Çeviri olmamalı kesinlikle özgün olmalı.
 
Kitabın adı da "Adım Adım WCF ! Senin Adın Ne ?" olabilir mesela. :)
Var mı gönüllü?
 
 


23 Mayıs 2013 15:49 tarihinde Tufan Dayi <td...@hotmail.com> yazdı:

Tufan Dayi

unread,
May 24, 2013, 7:31:29 AM5/24/13
to bnr...@googlegroups.com
Abdülkadir hocam cevaplarınız için çok teşekkür ederim.

B maddesinde aslında sormak istediğim şuydu; wcf servisi web referans olarak eklediğimizde mecburen gelen specified parametreleri neden xml web servis (.asmx) kullandığımız zaman gelmiyor? Xml web servis ile wcf'in web referans olarak eklendiğinde oluşturduğu yapı arasında ne fark var?

Yazılıma ilk başladığım zamanlar, bu tarihte çok eskiye dayanmaz aslında :) para kazanmak anlamında bakarsak Erdem hocanın yanında başladım diyebilirm. Kitap, blog yazma gibi şeyler düşünmüştüm; hatta böyle bir girişimimde oldu ama bir konuyu açıklarken tüm yönleriyle ele alamadığımı fark ettim bu nedenle vazgeçtim.

Tüm yönleriyle ele almaktan kastım nedir? Misal;

REST servis herkesin dilinde Rest aşağı, Rest yukarı nedir diye sorunca; işte url adresini yazıyorsun, sana xml ya da json geri dönüyor! eee!!! Esi bu işte, bu zaten bildiğimiz http mantığı ne farkı var? Bilmem! ozaman yapayım bir php, mvc controller, aspx handler vs... yazayım url adresini göndereyim parametresini bana geri dönsün! Tam öyle değil! Nasıl? İşte bunda methodlara özellikler ekleyerek bilmem ne yapabiliyorsun. Mesela methodu put alsın diye işaretleyebiliyorsun, put ne lan tövbe haşa, yaw işte post,put,get,delete form methodları... Hımm post dan ne farkı var? Aslında ben bütün methodlarımda post kullanıyorum. Hayırlı işler... :)

Bu gibi nedenlerden dolayı kitap yazmak benim için cahil cesareti olur :) Geçenlerde Burak Selim Şenyurt'un makalelerinden bahsettiğim buydu, bir sürü kavramı makalenin içine tıkıyor bunu okuyan kişinin bu kavramlardan haberi var mı yokmu diye düşünmüyor. Bunun üzerine şu denilenebilir, bu adamın makaleleri belli bir bilgi birikim gerektirir, geriye dönüp yaptığım işlere bakınca ve okuduğun makalede atıyorum WCF'e giriş olarak görünce, anlamam lazım :) acaba ben mi malım! makalenin altına; hocam elinize sağlık çok güzel anlatmışsınız, hocam bu konu bukadar güzel ele alınabilirdi, hocam yine başucu eseri tadında bir makale... Ben şahsen çoğunun ya yanlış anladığını ya da he he tamam deyip geçtiğini ya da kopyala çalıştır yapıp çalışınca anlamışım lan diye düşündüğünü, zannediyorum.

Eğer bir konu anlatılacaksa, anlatılacak konu üzerine proje geliştirmiş, sorun yaşamış, tecrübe edinmiş birinin konu ile ilgili karşılaşabileceği tüm kavramları ele alarak ve ele aldığı kavramlarında bağlatılı olduğu alt kavramlar varsa bunlarıda anlatarak öğretmesi gerektiğini düşünüyorum yoksa... he postback işte gidiyor, gelir!!!

Ama siz kitap yazarsanız mutlaka satın alıp okurum, verdiğiniz cevaplardan tecrübeniz anlaşılıyor.

Şu linklere de bakılması tavsiye olunur;

http://www.oguzyagmur.com/SearchView.aspx?q=Buton%20alt%C4%B1
http://ileriseviye.org/arasayfa.php?inode=programmingtenyears.html

Saygılar.


Date: Fri, 24 May 2013 12:03:19 +0300

Abdulkadir Bener

unread,
May 24, 2013, 10:12:42 AM5/24/13
to bnr...@googlegroups.com
:))
Kullandığın samimi dil için teşekkürler.
 
Uzun uzun kitapları okuyan olmaz artık sanırım.
Artık insanlar direk cevabı arıyor.
Hatta programcılar direk çözümü üretecek kod örneğine odaklanmış durumda.
Stackoverflow'u kapatsalar çoğu yazılımcı perişan olur muhtemelen.
Kısa kısa derleme makalelerle piyasa yapmaya çalışan bir grup da var maalesef, bu da doğru.
Ben en az yüz defa denk gelmişimdir. Adamın yazdığı makaledeki örneklerde kod hatası var.
Besbelli denememiş bile koyduğu kodları.
Mal olan bunlar işte.
 
Şu gerekli bir durum: üç beş sayfalık makalelerle teknolojinin (mesela WCF'in) geçmişi bugünü yarını oldukça teknik ifadeler içerecek şekilde, ama mutlaka insanların olayı kafasında canlandırmasına engel olmayacak berraklıkta anlatılmalı. Bunu yapanlar da var (çoğunlukla yabancı olanlar) sağ olsunlar.
 
Konuyla ilgili de bir iki satır yazayım da okuyucu arkadaşları kızdırmayayım; konu nerden nereye geldi demesinler.
 
WS ile WCF genellikle birbirine karıştırılıyor.
Ben dilim döndüğünce ve umarım hata yapmadan olayı aktarmaya çalışayım:
 
WS bir sunucudaki bir classın fonksiyonlarının HTTP protokolü kullanılarak başka bir bilgisayardan tetiklenmesi ve parametreler kullanılarak farklı sonuçların iletilmesini sağlayan text tabanlı (SOAP-XML) bilgiyi bir bilgisayardan bir başka bilgisayara taşımanın pratik bir yolu olarak hayatımıza girdi. Bunu biliyoruz zaten.
 
Ama bir kısım sıkıntıları da beraberinde getirdi.
(1) Şişman bir data üretiyor,
(2) Yavaş çalışıyor,
(3) Güvenlik sağlamak için dikkat etmek lazım (sonradan MS bir takım eklentiler filan üretti ama kullanımı pratik değildi, paket şifreleme mümkün değil)
(4) Her tür data transfer edilemiyor, (WCF'de de kısıtlama var ama WS kadar değil kesinlikle)
(5) Çok büyük boyutlu data transfer edilemiyor (100 MB dolaylarında sıkışıp kalıyorsunuz)
(6) İlle de response almak zorundasınız, datayı gönderdim cevabı lazım değil mantığı yok (ama bazı senaryolarda gerekli),
(7) Tracking ya da loglama yapmak oldukça emek gerektiriyor,
(8) State management zor, bu nedenle de manuel locking-blocking mekanizmaları geliştirmek zorundasınız,
(9) Sunucu tarafında tüm requestler için ortak in-memory veriler kullanmak dertli,
(10) Mesajları bir queue mantığıyla işleme almanız gereken senaryoları uyarlamak çok zor,
(11) Bazı durumlarda canlı aktif bağlantıları takip etmeniz gerekiyor ve bunu WS ile yönetmek çok çok zor,
(12) Sunucu tarafından terminale durup dururken data göndermeniz gereken durumlar (olaylar) olabiliyor, bunu WS ile çözemezsiniz,
(13) Sadece IIS üzerinde host edebilirsiniz, mesela bir servis uygulamasının veya bir desktop uygulamasının parçası yapamazsınız,
(14) Birden çok metod çağıracakken bunları transactionlarla birleştirmeniz imkansızdır.
(15) Ajax ile erişim çok zordur
(16) JSon desteklenmez,
(17) Peer To Peer diye bir şey kesinlikle yoktur,
...
 
Aklıma hızlıca bu kadarı geldi. Eminim genişletilebilir.
 
Bu sıkıntıların yanına bir de WS ile yazılan veri dağıtım sistemlerinin başka yollarla da dağıtılmasını gerektiren durumlar için yeniden yazılması zorunluluğu filan ortaya çıktı. Yani şöyle, servis kodlarını yazdım, WebServisleri için hazır, aynısını bir de TCP-Socket için yazmam lazım ne olacak? Microsoft da "Remoting" ile kullanılan avantajlı iletişim tekniği ile WS ile kullanılan iletişim tekniğini bir araya getiren ve yukarıdaki tüm sıkıntıları bertaraf eden bir kütüphane yazmaya karar verdi. Bu yeni kütüphanenin adından anlaşılacağı üzere her türlü iletişim sorununu çözecek bir kütüphane olmasına özen gösterdi.
 
Şunu demek istediler; WCF sadece XML data alıp veren bir web servisi değildir. Yirmi otuz satır kod yazarak bir chat server elde edebilirsiniz. Chat odasına girenler hemen senkronlanır, yazılan mesajlar anında kaç bin kişi login ise otomatik dağıtılır, 1 GB boyutunda bir filmi http üzerinden gayet kolay transfer edebilirsiniz, hatta transfer anında bir yandan izleyebilirsiniz, sunucudaki bir değişkenin değeri değiştiğinde terminallere son datayı dağıtabilirsiniz, sunucuda aynı anda kaç kişinin request atabileceğini basitçe ayarlayabilirsiniz, mesela bir metodun aynı anda sadece bir kişi tarafından çalışmasını temin edebilirsiniz. Filan filan filan.
 
Bu yepyeni bir kütüphane yazmayı gerektirdi tabi ki.
Ama bunu yaparken de eski teknolojiye uyumlu WS kullanabilen kişilerin WCF üzerinden veri almaları da engellenmesin onlar da veri alıp verebilsin diye bir kısım uyumluluk kodları da hazır edildi. WS olarak register edilen bir WCF servisinde tüm fonksiyonları sağlayamazsınız sebebi bundandır. Metodların parametrelerinde DotNet ufak tefek oynamalar yapabilir, yapar. Özellikle asenkron çalışma durumları için bu daha belirgindir.
 
Detaylar için http://msdn.microsoft.com/en-us/library/dd456779.aspx mutlaka başvuru yapılması gereken küçük bir yazı dizisi. :)
 
İyi günler.
 


24 Mayıs 2013 14:31 tarihinde Tufan Dayi <td...@hotmail.com> yazdı:
Reply all
Reply to author
Forward
0 new messages