Microsoft’un Çöpe Giden Yazılım Teknolojileri

25 Ara
  • Silverlight
  • WCF
  • WPF
  • Windows Forms
  • Web Forms

Microsoft teknolojilerinde son yıllarda önemli gelişmeler yaşanıyor. Takip etmekte zorlandığımız bu değişiklikler şüphesiz olması gereken şeylerdir. Yukarıda listelediğim teknolojiler, Microsoft’un  bir dönem parlayan yıldızlarıydı. Geçen zaman içinde yazılım dünyasında yaşanan evrim sonucu , Microsoft tarafında bir takım sorunlara çözüm bulmak ve bazı teknolojilerle rekabeti yakalayabilmek adına bir takım gelişmelere neden oldu. Yazılım dünyasındaki her yeni gelişme, karşımıza yeni bir ürün olarak çıktı. Gelişme ilerledikçe evrim, bir takım organların sonunu getirdi. Şunu da belirtmeliyim ki bu yazı Microsoft teknolojilerine karşı durmak için değil, bazı teknolojilerin zamanla yerini başka teknolojilere bıraktığını anlatmak amacıyla kaleme alınmıştır. Serbest pazar ortamında her firma ürününü ortaya koyar ve herkes istediği teknolojiyi dilediğince seçmekte özgürdür.

Silverlight

Adobe Flash, Java Flex v.b gibi client taraflı uygulamalara alternatif olarak üretilen zengin içerik ürünü Silverlight, mobil internet tarayıcılar tarafında yetersiz kalınca ve geliştiricilerin Javascript gibi tüm tarayıcılarda çalışabilen bir teknolojiyi tercih etmesiyle fişi çekilen teknolojilerden biri oldu. Ülkemizde ve diğer ülkelerde Silverlight düşkünü yazılımcılar için adeta bir hayal kırıklığı oldu. Çünkü bu gelişme birçok yatırımın güncelliğini yitirip zamanla çöpe gitmesi demekti.

WCF

Servis odaklı altyapı sistemleri için geliştirilen WCF teknolojisi SOAP ve RESTful servisler oluşturmak için bir altyapı sunmaktadır. HTTP tabanlı REST servislarinin yaygınlaşmasıyla ivme kaybeden ve durma noktasına gelen hatta bitti denilebilecek teknolojilerden birisi. WCF teknolojisi SOAP servisleri oluşturmak için ideal bir seçimdir. Ancak RESTful servisler oluşturma konusunda liderliğini WEB API teknolojisine kaptırmıştır. (Güncelleme: WCF servislerinin REST ve SOAP ayrımına vurgu yapıldı. 21.02.2015)

Windows Forms

Masaüstü programlama araçlarından Windows Forms teknolojisi ise WPF teknolojisinin gelmesiyle silikleşen teknolojiler arasında. WPF teknolojisini Windows Forms teknolojisine göre makul kılan özelliklerin başında View tarafı ile Model tarafının birbirinden ayrılmasını sağlamasıydı. Windows Froms, kod arayüzü ve grafik arayüzü ile çalışmaktadır. WPF ise kod arayüzü, grafik arayüzü ve grafik arayüzünü şekillendirebilen XAML arayüzü ile ortaya çıkmıştır. Bu durumda MVVM (Model-View-ViewModel) yazılım desenlerinin uygulanması kolaylaşmakta ve daha kolay yönetilebilir uygulamalar geliştirilebilmektedir.

WPF

Windows 8 ile birlikte bizi işletim sistemi düzeyinde şaşırtan Microsoft, XAML teknolojisini .Net framework tarafından işletim sistemi üzerine alarak bizi tekrar şaşırttı. Bu da demek oluyor ki artık masaüstünde artık WinRT teknolojisi yer alacak. Bu durumda WPF teknolojisi de yıkılmak üzere demektir.

Web Forms

Microsoft’un Web geliştirme tarafında sihirli çubuğu olan Web Forms teknolojisi de MVC uygulama mimarisine yenik düştmüştür diyebiliriz. Web Forms ile oluşturulmuş birçok popüler web sitesi bu günlerde MVC teknolojisine geçiş yapmaya başladı bile. Web Forms teknolojisinin hakkını yememek lazım ki çok sayıda popüler uygulamaya temel oluşturmuştur. Ancak MVC teknolojisinin iş birimlerinin birbirinden ayrılmasını sağlayan mimarisi ve bu sayede geliştirici hakimiyetini ön plana çıkarması ayrıca birim test yazmaya olanak  sağlaması zamanla onu popüler hale getirmiştir. Şahsen ben Web uygulamalarına direk MVC tarafından başlayanlardanım. (Güncelleme: 21.02.2015)

Microsoft gelişime, yeniliğe önem veren bir şirket. Ancak insanların yıllarca üzerinde çalışıp yatırım yaptığı teknolojilerin birden yok olması geliştiricileri ve şirket yöneticilerini sıkıntıya sokabiliyor. Bu durumda şu soru akıllara geliyor. Bu teknoloji de son bulursa ne yapacağız? Gelişim oldukça bir şeylerin sonu gelecek elbette.

Çöpe giden teknolojiler sadece Microsoft tarafıyla sınırlı değildir. Open source tarafında da çok fazla proje çöpe gitmiştir. Örneğin java tarafında da MVC yaygınlaşınca Serve taraflı bileşen teknolojiler pek tercih edilmez hale gelmiştir.

Bu durumda öngörülü olmak önem arz etmektedir. Spesifik teknolojiler yerine platform bağımsız teknolojilere eğilim göstermek her zaman faydalı olacaktır. Hangi programlama dili olursa olsun, yapılan iş genele hitap edecek şekilde tasarlanmalıdır. Bu sayede genişletilebilirlik(extensibility) ilkesi ile hareket etmiş oluruz ve hiç bir teknolojiye sıkı sıkıya bağımlı kalmayız.

Kitap – Programming WCF Services 3rd Edition

8 Eyl

Okuyucuyu,  WCF (windows comminication foundation) dünyasının derinliklerinde gezintiye çıkaran bir kitap. Kitabın kapağındaki balığın sebebi de bu dur belkide. Derinlerde gezen bir balık. O’Relly yayınlarının birçok kitabının kapağında ayrı bir hayvan resmi kullanılır. Kapaklarda kullanılan hayvanların listesini merak ederseniz buradan ulaşabilirsiniz.

Bu kitapta WCF mimarisi derinlemesine anlatılmaktadır. Yaklaşık 900 sayfalık bir kitap olması, ne kadar ince detaylara indiği konusunda fikir verebilir.

Kitabı, amazon.com üzerinden satın alabilirsiniz.

Eğer WCF servisleri konusunda, sıfırdan uygulamalar geliştiren bir kitap arıyorsanız, bu kitap size göre değil. Ama WCF servislerini öğrenmeye başladınız ve neyi neden yaptığınızı merak ediyorsanız bu kitap tam size göre. Kulandığınız her nesnenin ne işe yaradığını ve nasıl kullanıldığı anlatılmış, örnek kod parçaları ile güçlendirilmiştir.

Okumaktan zevk aldığım bir kitap. Umarım siz de zevkle okursunuz.

WCF Transfer Security Ayarları

4 Ağu

WCF transfer güvenliği seçeneklerini None,Transport security, Message security, Mixed ve Both olarak sıralamıştık. Bu güvenlik seviyelerinin WCF uygulamalarında uygulandığı yer binding kısmıdır. İstemci ve sunucu aynı ulaşım güvenliği seçeneğini uygular. Binding konfigurasyonu, programatik olarak kod tarafında ayarlanabildiği gibi config dosyası yardımıyla da ayarlanabilmektedir. Aşağıdaki listede hangi binding ile hangi ulaşım güvenliğinin kullanılabileceğini göstermektedir.

Adı None Transport Message Mixed Both
BasicHttpBinding Evet(Varsayılan) Evet Evet Evet Hayır
NetTcpBinding Evet Evet(Varsayılan) Evet Evet Hayır
NetNamedPipeBinding Evet Evet(Varsayılan) Hayır Hayır Hayır
WsHttpBinding Evet Evet Evet(varsayılan) Evet Hayır
NetMsmqBinding Evet Evet(Varsayılan) Evet Hayır Evet

Intranet için kullanılan binding tipleri şunlardır: NetTcpBinding, NetNamedPipeBinding, NetMsmqBinding.

Config dosyasında binding ayarlarını şu şelide yapabiliriz.

<bindings>
    <wsHttpBinding>
       <binding name="Binding1">
           <security mode="Message"/>
                <message clientCredentialType="UserName"/>
           </security>
       </binding>
    </wsHttpBinding>
</bindings>

Binding türüne göre security mode seçeneğinde, kullanılabilen güvenlik tipleri listelenmektedir. Yani bu güvenlik tiplerinin nerede kullanılacağını ezberlemek zorunda değiliz.

Kaynak: Bu yazının hazırlanmasında Programming WCF Services kitabından faydalandım.

WCF Transfer Security Seçenekleri

2 Ağu

WCF transfer güvenliği için beş farklı seçenek sunmaktadır. Bir servisin güvenliğini sağlamak istediğimizde hangi öncelik bizim için daha avantajlıysa o biçimde transfer seçeneğini belirleriz. Güvenlikte birincil önceliğimizi doğru şekilde belirlemeliyiz. Transfer güvenliği seçeneklerini şu şeklide sıralayabiliriz: None,Transport security, Message security, Mixed ve Both.

None Transfer Security

Adından da anlaşılacağı üzere bu seçenekte herhangi bir güvenlik bulunmamaktadır. WCF güvenliği tamamen kapalıdır. Herhangi bir istemci kimlik bilgisi istenmemektedir. Mesajlar, herhangi bir mahremiyet korumasında değildir. Mesaj gizliliği açısında doğru bir yöntem değildir.

Transport Transfer Security

Bu güvenlik seviyesinde WCF, güvenli iletişim protokollerini kullanır. Bu protokoller, HTTPS, TCP, IPC ve MSMQ protokolleridir.Transport security, kanal üzerindeki tüm iletişimi şifreleyerek, bu şekilde mesaj bütünlüğünü, mahremiyeti ve kimlik doğrulamasını sağlar. Mesaj içeriğinin değiştirilmesine yönelik herhangi bir girişim, şifreleme anahtarı bilinmediğinden başarısızlıkla sonuçlanacaktır ve bu da mesaj bütünlüğünün sağlandığının bir kanıtıdır. Alıcıdan başka kimse mesaj içeriğini göremediğinden mahremiyet sağlanmaktadır. Karşılıklı kimlik doğrulamaları gerçekleştirildiğinden, mesajı sadece alıcı okuyabilmektedir. Bu sayede güvenilir olmayan end point’ler ile mesaj aktarımı sağlanmaz.

Başlıca dezavantajı, sadece noktadan noktaya (point-to-point) olan taşıma güvenliğini garantilemesidir. İstemci, arada herhangi bir aracı bulunmadan direk servise bağlanır. Dolayısıyla ulaşım, güvenli bir ortamda sağlanmış olur. Bu iletişim güvenliği genelde intranet uygulamalarında kullanılır.

Message Transfer Security

Mesaj güvenliği seviyesinde mesajın kendisi şifrelenir. Mesajın şifrelenmesiyle, Transport güvenliğinde olduğu gibi, mesaj bütünlüğü, mahremiyeti ve kimlik doğrulaması sağlanarak mesajın içeriğinin okunmasına yönelik yapılan herhangi bir okuma girişimi başarısızlıkla sonuçlanmış olur. Mesaj içeriği şifrelendiğinden HTTP gibi güvenli olmayan protokoller üzerinden gönderilebilir. Bu nedenle ulaşım sağlayan aracılara ve taşımanın güvenliğine bakılmaz. Buna ek olarak Mesaj güvenliği, Dos Attack ve replay attack gibi saldırılara yönelik bir dizi standart ile tasarlanmıştır. Message transfer güvenliğinin dezavantajı da mesajın iletim süresinin artmasına bağlı gecikmelerin yaşanmasıdır. Bu güvenlik seçeneği internet uygulamalarında kullanılır.

Mixed Transfer Security Mode

Mixed güvenlik seçeneği, servis doğrulamasının yanı sıra mesaj bütünlüğünü ve mahremiyetini sağlamak için Transport güvenliğini, istemci kimliğinin doğrulanması için de Message güvenliğini kullanır. Bu karma yapı sayesinde Transport ve Message güvenlik seçeneklerinin avantajlarından faydalanmak hedeflenmiştir. Dezavantajı, Transport  güvenliğinden dolayı, noktadan noktaya (point-to-point) ulaşımlarda kullanılmasıdır.

Both Transfer Security Mode

Adından da anlaşılacağı üzere Both transfrt güvenliği, hem Transport hem de Message güvenlik seçeneğini kullanır. Mesajın kendisi şifrelenerek güvenli bir şekilde iletilir.

Kaynak: Bu yazının hazırlanmasında Programming WCF Services kitabından faydalandım.

Bing Maps SOAP Service, Search Service

23 Tem

Bing Maps SOAP servisleriyle .Net uygulaması geliştirmek başlıklı yazımızın devamı niteliğinde olan bu yazıda da bir başka SOAP servisi olan Search Servisini  incelemeye çalışacağız.

Servisin, uygulamaya nasıl dahil edileceğini bir önceki  Geoscodes service yazısında incelemiştik. Aynı süreci işleterek uygulamaya servisi eklemek mümkündür. Bu yazıda da servisin amacından bahsetmeye çalıştım.

Search service kullanarak bir yerde bulmak istediğimiz şeyleri arayabiliriz. Örneğin bir şehirdeki hastane, postane, sushi, hamburger gibi aramaları yapmak mümkündür.

Kodda düzenleme (refactoring) yapılmamış olması, kodun okunabilirliğini biraz zora sokmuş olabilir. Aceleden dolayı kod bu şeklide kaldı.

Arama işlemlerini bir class üzerinden yürütmeye çalışalım. Arama sorgusu, Keyword ve Location şeklinde parametrelere göre oluşturulmaktadır.

Arama kriterini keyword ve location kelimelerini, noktalı virgülle ayırarak yapabiliriz.

Örneğin: “hospital;london” şeklinde hastaneleri aramak.


public class Search
{

    public string SearchKeywordLocation(string keywordLocation)
    {

       String results = "";
       String key = AppConfig.BingKey;

       SearchRequest searchRequest = new SearchRequest();
       searchRequest.Credentials = new Credentials();
       searchRequest.Credentials.ApplicationId = key;

       StructuredSearchQuery ssQuery = new StructuredSearchQuery();

       string[] parts = keywordLocation.Split(';');
       ssQuery.Keyword = parts[0];
       ssQuery.Location = parts[1];
       searchRequest.StructuredQuery = ssQuery;

       searchRequest.SearchOptions = new SearchOptions();

       searchRequest.SearchOptions.Filters =

       new FilterExpression()
       {
          PropertyId = 3,
          CompareOperator = CompareOperator.GreaterThanOrEquals,
          FilterValue = 8.16
       };

       SearchServiceClient searchService = new SearchServiceClient();
       SearchResponse searchResponse = searchService.Search(searchRequest);

       if (searchResponse.ResultSets[0].Results.Length > 0)
       {
           StringBuilder resultList = new StringBuilder("");

           for (int i = 0; i < searchResponse.ResultSets[0].Results.Length; i++)
           {
              resultList.Append(String.Format("{0}. {1}\n", i + 1,
              searchResponse.ResultSets[0].Results[i].Name));
           }

          results = resultList.ToString();

      }
      else
          results = "No results found";

      return results;

   }

}

Arama kriterini böldüğümüz yer şurası:


StructuredSearchQuery ssQuery = new StructuredSearchQuery();
string[] parts = keywordLocation.Split(';');
ssQuery.Keyword = parts[0];
ssQuery.Location = parts[1];
searchRequest.StructuredQuery = ssQuery;

Servisi çalıştırdığımızda is sonucu şu şekilde alabiliriz.

Londra’daki hastaneleri bu şeklide listeleyebiliyoruz.

Bing Maps SOAP Service, Geocode Service

22 Tem

Bir önceki yazımızda Bing Maps SOAP servislerini incelemeye başlamıştık. Bu yazımızda da yer bulucu servis olan Geococe servisini inceleyeceğiz.

Bu servis sayesinde verilen bir yerin coğrafi konumunu elde etmek mümkündür. Coğrafi konumu elimizde olan bir yerin de adres bilgisini elde etek mümkündür. Servisin sağladığı iki metod bu işlemleri yerine getirir.

Şimdi bir adrese ait coğrafi konum bilgisini bir örnek yardımıyla elde etmeye çalışalım.

Öncelikle elimizde bir Bing Maps Developmet Account Key olması gerekir. Bu key https://www.bingmapsportal.com ‘dan elde edilebilir. Bu key kodlama sırasında bize gerekecektir.

Servisin kullanılabilmesi için projemize eklenmesi gerekmektedir. Bu işlem için projemize sağ tıklayıp Add Service Reference diyoruz. Karşımıza çıkan pencereye aşağıdaki servis linkini yapıştırıyoruz.

http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

Servisimiz Yukarıda bahsettiğimiz gibi iki adet metod içermektedir.

Bu örnekte Geocode metodunu kullanacağız.


public Location CalculateGeocodeOf(string address)
{
       GeocodeRequest geocodeRequest = new GeocodeRequest();
       geocodeRequest.Credentials = getCredentials();
       geocodeRequest.Query = address;
       geocodeRequest.Options = getGeocodeOptions();

       GeocodeServiceClient geocodeService = new GeocodeServiceClient();
       GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

       if (geocodeResponse.Results.Length > 0)
       {
           var location = new Location();
           location.Latitude =  geocodeResponse.Results[0].Locations[0].Latitude;
           location.Longitude = geocodeResponse.Results[0].Locations[0].Longitude;

           return location;
       }

       return null;
}

private GeocodeOptions getGeocodeOptions()
{
    GeocodeOptions geocodeOptions = new GeocodeOptions();
    geocodeOptions.Filters = getConfidenceFilter();

    return geocodeOptions;
}

private ConfidenceFilter[] getConfidenceFilter()
{
    ConfidenceFilter[] filters = new ConfidenceFilter[1];
    filters[0] = new ConfidenceFilter();
    filters[0].MinimumConfidence = Confidence.High;

    return filters;
}

private Credentials getCredentials()
{
     Credentials credential = new Credentials();
     credential.ApplicationId = AppConfig.BingKey;

     return credential;
}

Hazırladığımız CalculateGeocodeOf metodu yardımıyla bir adresin coğrafi konumunu elde edebiliriz.

Bunu bing map üzerinden de doğrulayabiliriz.

Bing Maps SOAP Servisleriyle .Net Uygulaması Geliştirmek

20 Tem

Bing Maps, AJAX destekli uygulamaların sağlamanın yanında bir de desktop uygulamalarda kullanılmak üzere geliştirdiği SOAP servislerini de hizmete sunmaktadır. SOAP servisleri birer WCF (Windows Presentation Foundation) uygulamasıdır. Bu yönüyle WCF servislerini kullanmış olanlara büyük olanak sağlamaktadır.

Bing Maps SOAP servisleriyle, Visual Studio üzerinde uygulama geliştirmek için öncelikle Bing Map Platform Developer Account oluşturmak gerekmektedir. Bing Maps Account Center üzerinden hesap oluşturmak mümkündür. Oluşturulan hesap üzerinden development amacıyla bir application key üreterek uygulamalarda kullanabilirsiniz.

Bing Maps SOAP Servisleri

GeocodeService : http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

SearchService    : http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc?wsdl

ImageryService : http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc?wsdl

RouteService      : http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl

Geocode Service

Bu servis, coğrafi konumları adreslere dönüştürmek veya adresleri coğrafi konumlara dönüştürmek için kullanılır.

Örneğin: İzmit, Kocaeli adresinin Latitude ve Longitude değerlerini verir. Ya da Latitude ve Longitude değerleri verilen bir coğrafi konumun adres bilgisini üsküdar, istanbul şeklinde verir.

Search Service

Bu servis, “ne/nerede” şeklindeki aramaların sonucunu döndüren tek bir metod sunar. Örneğin Colarado’da pizza yemek istiyorsunuz. “pizza;co” şeklinde bir arama yaptığımızda bize Colarado’da pizza yapan restoranların listesini döndürecektir.

Imagery Service

Bu servis, iki metod barındırmaktadır. İlk metod harita görüntülerinin alınmasını sağlar. Diğer metod ise ilgili resmin metadata bilgisinin alınmasını sağlar.

Route Service

Bu servis, iki nokta arasındaki rotanın hesaplanmasını sağlar. Bu hesaplamayı başlangıç noktasından varış noktasına doğru ana yönleri noktasal şeklide belirleyerek yapar.

Örneğin; A noktası, 1km sonra Sola dön, 2km sonra sağa dön şeklinde.

Bu servisleri, fırsat buldukça uygulamalarla incelemeye devam edeceğiz.

WCF Data Service ile Database Verisine Erişim

28 Oca

Bir önceki WCF Data service ile ilgili yazımızda herhangi bir veri kaynağına bağlı olmayan veri kolleksiyonlarına servisler aracılığıyla erişimi incelemiştik. Bu yazıda ise bir veri kaynağına bağlı olan EDMX modeldeki veri kümelerine WCF data servisleri aracılığıyla erişmeyi inceleyeceğiz.

İlk olarak WcfDatabaseDataservice adında yeni bir Web projesi eklenir. Projeye StoreModel adında yeni bir ADO.Net Entity Data Model eklenir.

Model üzerindeki veri kümelerine erişmek için projeye StoreService adında bir WCF data service eklenir.


   public class StoreService : DataService<StoreEntities>
   {
       public static void InitializeService(DataServiceConfiguration config)
       {
          config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
          config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
       }
   }

Servis tipinin  DataService<StoreEntities> generic tipinden türetildiği görülmektedir. Yani StoreEntities içindeki veri kümelerine erişilecek.

SolutionExplorer penceresindeki StoreService.svc dosyasına sağ tıklayıp “View in Browser” seçeneği ile servise web browser üzerinden erişebiliriz.

Servis aracılığıyla Collection düğümlerindeki veri kümelerine, kendine ait URI’ler yardımıyla erişilebilir. Örneğin kategorilere erişmek için http://localhost:10182/StoreService.svc/Categories kullanılabilir.

Model üzerindeki stored procedure kullanılmadan önce Function Import işleminden geçirilmelidir. Bunun için Model Browser penceresinden ilgili stored procedure ki örneğimizdeki store procedure adı GetProductSP’dir. Bu procedure sağ tıklayıp Add Function Import tıklanır ve açılan pencerede Get Column Information butonu tıklanarak kolon bilgileri listelenir. Ardından Create New Complex Type butonu ile GetProductBySP_Result kompleks tipi oluşturulur.

WCF data servisi üzerinden GetProductSP function import’una direk erişilemez. Ancak StoreService sınıfına bir metod ekleyerek, metod üzerinden erişim sağlayabiliriz. Servis sınıfına eklenen metodlar servis operasyonları(Service Operations) olarak adlandırılır. Servis operasyonları parametre alabilir. Fakat servis oprasyonlarının geri döndürdüğü değerler Ienumerable, Iqueryable veya void tipinde olmalıdır.

Servis operasyonları WebGet veya WebInvoke attribute ile imzalanmalıdır. WebGet attribute, HTTP GET ile çalışır, WebInvoke ise HTTP POST ile çalışır. Aşağıdaki örnek, WebGet attribute ile imzalanmış bir servis operasyonunun URI yardımıyla nasıl çalıştırıldığını göstermektedir.

public class StoreService : DataService<StoreEntities>
{
        public static void InitializeService(DataServiceConfiguration config)
        {
           config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
           config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
           config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

        [WebGet]
        public IQueryable<GetProductBySP_Result> ProductsBySp()
        {
           using (StoreEntities context = new StoreEntities())
           {
              return context.GetProductBySP().ToList().AsQueryable();
           }
        }
    }

Servis ayarlamalarının yapıldığı DataServiceConfiguration sınıfının servis operasyonlarının yetkilerini belirlediği bir metod vardır. Bu metod setServiceOperationAccessRule metodudur.

Metodu browser üzerinden http://localhost:10182/StoreService.svc/ProductBySp şeklinde çağırılır.

Sonuç olarak servis aracılığı ile modeldeki bir “stored procedure” erişimini incelemiş olduk.

Umarım faydalı bir yazı olmuştur.

WCF Data Servis Custom Collection Uygulaması

25 Oca

WCF data servisleri mimarisini bir önceki yazımızdada kısaca özetlemiştik. Bu yazımızda ise bir WCF data servisinin nasıl oluşturulduğunu ve kendi özel sınıfımıza ait bir kolleksiyona bu servis üzerinden erişildiğini inceleyeceğiz.

Visual studio ortamından WcfCustomDataService adında yeni bir web projesi başlatarak bu proje üzerinde incelemelerimizi yapabiliriz.

Projemize Product ve Category adında iki yeni sınıf ekliyoruz.


    [DataServiceKey("Id")]
    public class Product
    {

        public int Id { get; set; }
        public string Name { get; set; }

    }

    [DataServiceKey("Id")]
    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }

    }

Sınıflarımıza baktığımızda DataServiceKey ile servis anahtar property değerinin belirlendiğini görüyoruz. Bu attribute ile belirlenen anahtar özellik sayesinde OData, istenen elemana ulaşabilmektedir. DataServiceKey attribute System.Data.Services.Client.dll içindeki System.Data.Services.Common alanında bulunmaktadır. Eğer bu dll projenize dahil değilse eklemeniz gerekecektir.

Servisimiz ile ulaşabileceğimiz kolleksiyonları bulunduracağımız Store adında bir sınıf ekleyerek içerisine kolleksiyonlarımızı bu sınıf içerisine yerleştirebiliriz. Store içerisine ProductSet ve CategorySet adında iki adet generic IQueryable kolleksiyon ekliyoruz. Generic tip IQueryable olmalıdır.

    public class Store
    {
        public IQueryable<Product> ProductSet
        {
          get
          {
             return new List<Product>
             {
               new Product{ Id=1, Name="Game Console" },
               new Product{ Id=2, Name="IBM Computer"},
               new Product{ Id=3, Name="Baby Toy"}

             }.AsQueryable();
          }
        }

       public IQueryable<Category> CategorySet
       {
         get
         {
            return new List<Category>
            {
               new Category{ Id=1, Name="Game" },
               new Category{ Id=2, Name="Computer"},
               new Category{ Id=3, Name="Toys"}

            }.AsQueryable();
         }
       }
   }

Şimdi projemizde kullanacak olduğumuz servisi eklemeye geldi. WCF data servis ekleme işlemi için projemize sağ tıklayıp Add -> New Item şeçeneği yardımıyla  StoreService.svc adında bir “WCF Data Service” ekliyoruz. Servisimiz eklendiğinde kod kısmını aşağıdaki şekilde düzenliyoruz.

   public class StoreService : DataService<Store>
   {
       public static void InitializeService(DataServiceConfiguration config)
       {
          config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
          config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
       }
   }

StoreService sınıfı DataService<Store> generic tipinden türetilmiştir. Burada Store tipi bizim daha önceden tanımladığımız kolleksiyonları tutmaktadır.

InitializeService metodu DataServiceConfiguration tipinde servis ayarlarını belirleyen bir parametre almaktadır.

DataServiceConfiguration  tipinin SetEntityAccessRule metodu iki parametre alamktadır. Birinci parametre string türündedir ve entity adını belirler, ikincisi ise EntitySetRights numaralandırıcı tütündedir ve entity erişim kurallarını belirler.

Örnek:

            config.SetEntitySetAccessRule("ProductSet", EntitySetRights.AllRead);
            config.SetEntitySetAccessRule("CategorySet", EntitySetRights.None);

Yukarıda örnekte belirlenen kuralda, ProductSet için tüm okuma yetkileri verilmiş, CategorySet için tüm erişimler kısıtlanmıştır. Bu durumda servis çağrıldığında sadece ProductSet verilerine erişilebilmektedir.

Biz bu örnekteki ayarları kullanmadan  varsayılan ayarlar ile devam ediyoruz.

Servisi hazırladıktan sonra StoreService.svc’ye sağ tıklayıp “View in Browser” seçeneğini tıklayarak servise browser üzerinden ulaşabilmekteyiz. Browser, servisi XML formatında bize sunmaktadır.

ProductSet ve CategorySet kolleksiyonlarına özel URI konumlandırıcılar belirlenmiştir. Adres sonuna ProductSet ekleyerek koleksiyon içeriğine de ulaşmak mümkündür.

Bu noktada servisin sunduğu entity tiplerine ait şema bilgisini elde etmekte mümkündür. Bunun için ise URI sonuna /$metadata ekleyerek gerekli metadata bilgisi alınabilmektedir.

Bu yazıda kendi tiplerimize ait kolleksiyonlara ve metadata bilgilerine, WCF Data Servisleri yardımıyla nasıl erişilebileceğini incelemiş olduk. İlerki yazılarda WCF data servislerini daha yakından incelemeye çalışacağız.

WCF Data Services

24 Oca

WCF data servisleri Open Data Protokolünü(OData) kullanarak, WEB veya intranet ortamına Atom ve JSON formatında veri sunabilen servislerdir. OData protokolü URI’ler aracılığıyla adreslenemiş veri kaynaklarına erişmeye olanak sağlar. Bu sayede veri erişimi ve güncelleme işlemleri, standart HTTP işlemleri olan GET, POST, PUT ve DELETE ile yapılabilmektedir.

WCF Data Service Mimarisi

Aşağıdaki şekilde WCF Data Service mimarisi gösterilmektedir.

Şekilde kullanıcı, open data protokolü ve sunucu şeklinde üç ayrı seviye belirlenmiştir.

Kullanıcı tarafı uygulama bağımsızlığına dayanmaktadır. Yani OData protokolü üzerinden gelen verilere herhangi bir platformdan ulaşmak mümkündür.

Sunucu tarafı ise herhangi bir veri kaynağından elde ettiği veriyi OData protokolü üzerinden kullanıcı tarafına sunmaktadır.

WCF data servis mimarisini kısa cümlelerle özetlemeye çalıştık. Bir sonraki yazıda ise WCF data servislerini kullanarak kendi özel kolleksiyonlarımıza nasıl erişebileceğimizi inceleyeceğiz. Hemen ardından gelecek yazıda ise gerçek veritabanına erişebilen EDMX modele ait verilere WCF data servisleri yardımıyla erişmeye çalışacağız.