Makale Özeti

Sharepoint Foundation 2010 ile birlikte gelen önemli ve dikkat çekici yeniliklerden birisi de Client Object Modeldir.Bu yazımda Client Object Modelden bahsetmeye çalışacağım.

Makale

Sharepoint Foundation 2010 ile birlikte gelen önemli ve dikkat çekici yeniliklerden birisi de Client Object Modeldir.Bu yazımda Client Object Modelden bahsetmeye çalışacağım. Sharepoint 2007 ortamı için uygulama geliştirirken yaşanılan en önemli kısıtlamalardan biri geliştirme yapacağımız makinede Windows Sharepoint Services 3.0 ya da Sharepoint Server 2007 kurulu olması zorunluluğudur.Bu sebeptendir ki Sharepoint 2007 geliştiricileri için ,Sharepoint 2007 kurulu bir virtual makine geliştirme yapabilmek son derece gerekli bir araçtır. Yukarıda bahsettiğim kısıtlamadan dolayı , Sharepoint 2007 üzerindeki dataya (site kolleksiyonu,web,list v.s) ya server tarafında yazacağımız kod ile erişebiliriz.

* Server Side Application

* Client Side Application

Sharepoint Foundation 2010 ile birlikte gelen Client Object Model ile Sharepoint 2007 de yukarıda bahsettiğim uygulama geliştirme yöntemlerinden farklı olarak Sharepoint yüklü olmayan client bir makinede de uygulama geliştirme imkanı sağlanmaktadır.Bununla birlikte Silverlight ve Ajax desteği ile Client Object Modeli kullanarak görsel arabirimi çok daha güçlü Sharepoint uygulamaları geliştirebiliriz.Şimdi konumuzu biraz daha detaylandırarak devam edelim…

Sharepoint 2010 ile birlilkte client uygulamaların tipine göre farklılaşan 3 yeni Client Object Model API gelmektedir.

1.Net Client Object Model

  • Web,Windows,Console uygulamalarından kullanım için gerekli Client API dir.
  • Uygulamaya Microsoft.Sharepoint.Client.dll ve Microsoft.Sharepoint.Client.Runtime.dll referans olarak eklenmelidir.
  • Gerekli dll’ler –> “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI” folderının altında yer almaktadır.

2.Silverlight Client Object Model

  • Silverlight uygulamalarından Sharepoint objelerine erişim için kullanılır.
  • Uygulamaya Microsoft.SharePoint.Client.Silverlight.dll ve Microsoft.SharePoint.Client.Silverlight.Runtime.dll referans olarak eklenmelidir.
  • Gerekli dll’ler — > “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin” folderının altında yer almaktadır.

3.ECMAScript Client Object Model

  • Sharepoint üzerinde host edilmiş bir uygulamadan javascript kod ile Sharepoint object modele erişim için kullanılır
  • Uygulamaya SP.js dosyası eklenir.
  • İlgili dosya –> “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS” folderının altında yer almaktadır.

Client ve Server Side Sınıfların Karşılaştırılması

Client Object Model dizayn edilirken sınıf adları Server Object Modelde aynı nesneyi işaret eden sınıf adlarına benzer verilmiştir.Aynı tipte nesneyi işaret eden sınıfların adlarının birbirine benzer verilmesi client object model ile geliştirme yapan bir geliştiricinin kolayca Api ‘ yi tanımasını ve benzer şekilde uygulama geliştirmesini sağlamaktadır.

Aşaığdaki tablo Server Side Object Model ile Client Object Model deki sınıfların birbirlerine eşleneğini göstermektedir.

Client Object Model Nasıl Çalısır ?

Client Object Modeli kullanan bir uygulama, Sharepoint Server’a bir istekte bulunduğu zaman istek Client API vasıtasıyla XML’e dönüştürülerek Server tarafında bulunan ve Sharepoint Object Modeli ile konuşan client.svc adında bir WCF servisine gönderilir.Client.svc isteği alarak Server Object Modele gönderir ve gelen cevabı JSON tipinde bir nesneye dönüştürerek tekrar client uygulama geri gönderir.Client Object Model ile Server Object Modelinin konuşmasını sağlayan server tarafında bulunan client.svc adında bir servistir.

Sharepoint 2007 de yukarıdakine benzer olarak Sharepointin sunmuş olduğu web servisleri ya da (eğer servera ulaşabiliyorsak) server tarafına kendi yazdığım web servisleri client uygulamadan çağırarak Sharepoint datasına erişim sağlıyorduk.Microsoft, Sharepoint 2010′da Client Object Modeli geliştirerek müşterilerinden gelen ve altyapıya yeni sürümde yeni servis isteklerinin tamamına çözüm sağlamış oldu .(Kullanıcılar web servisten bekledikleri business logic’i kendileri geliştirebilmektedirler)..Microsoft bu şekilde yeni süremde web servis metotları çöplüğününde önüne geçmiş oldu..

Client Object Modelin Destekledikleri ve Kısıtları (Supported Areas And Limitations)

Destekledikleri
* Sharepoint kurulu olmayan bir makineden Sharepoint Object Modele erişim
* CRUD işlemlerin Sharepoint nesneleri üzerinde gerçekleştirilmesi ( Site Collection,Site,List,View,Files,Content Types,Web Parts ,Site Template )

Kısıtları
• Client Object Modelde güvenlik ve performans nedenlerinden ötürü bazı Sharepoint objeler(Administration objects) yer almaz..
• RunWithElevatedPrivileges ve ya Impersonate işlemleri Client Object Modelde yapılamaz.O yuzden çalısan metotlar kişinin yetkisi dahilinde data döndürür.
• Listelerden client object model ile kayıt çekilriken listenin belirli sayıda kayıt gelebilir.Listeleri okurken geri dönüşün kayıt sayısı belirii sınırlardadır.
• Client API ile web application seviyesinde CRUD ve diğer işlemler yapılamaz..Client Object Modelde en üst seviye obje Site Kolleksiyondur.

Basit bir örnek uygulama ile konumuzu pekiştirelim…

Uygulamamız .Net Managed Client Object Modeli kullanan bir Console uygulamasıdır .Uygulamada Client Object Modele ait temelleri irdelemeye çalışacağım.Senaryomuz sharepoint site de yer alan bir listeden veri çekme şeklinde olacak.

1.Visual Studio 2010 üzerinde File –> New seçerek bir Console Application başlatıyoruz..

2.Uygulamamız bir console uygulaması olduğu için .Net Managed Client Object Model için gerekli olan dll’lerimizi ekliyoruz..

  • * Microsoft.Sharepoint.Client
  • * Microsoft.Sharepoint.Client.Runtime

3.Öncelikle kodumuzu yazalım.Daha sonra detaylı bir şekilde inceleyelim…

static void Main(string[] args)
{
ClientContext clientContext = new ClientContext("http://t1lprvt1039:46371/");
List list = clientContext.Web.Lists.GetByTitle("ComTestList");
clientContext.Load(list);
clientContext.ExecuteQuery();
Console.WriteLine("List Title: {0}", list.Title);
}

  • Sharepoint Object Model ‘de sharepointe baglantı sağlamak için kullandığımız SPSite(URL) sınıfına benzer olarak Client Object Modelde Sharepoint datasına erişimi ClientContext sınıfı ile sağlıyoruz.Tüm Client API’lerde başlangıc noktamız ClientContext tipinde bir nesne üretmektir.
  • clientContext nesnesi yaratıldıktan sonra sharepoint ile iletişim ExecuteQuery metodu çalıştıktan sonra gerçekleşir.ExecuteQuery’den önceki işlemler iletişim sağlandığı sırasında yapılacak işlemlerin tanımlandığı kısımdır diyebiliriz…
  • Örneğimizde “ComTestList” adında bir listeye bağlanarak bu listenin Başlık bilgisini Client Object Model ile alacağız..
  • Uygulama çalıştırıldığı anda giden gelen paketleri incelemek için Fiddler (www.fiddler.com) uygulamasını çalıştırıyoruz.Uygulamayı Visual Studio üzerinde adım adım ilerletip (F11 ile) Fiddler ile monitor ettiğimizde ExecuteQuery çalışana kadar herhangi bir paketin gidip gelmediğini , ExecuteQuery ile birlikte uygulamamazın Sharepoint ile iletişime girdiğini görüyoruz..

- Authentication ile alakalı giden gelen paketlerden sonra
- /_vti_bin/client.svc/ProcessQuery olan satır önemlidir. Bu log kayıdı ile yukarıda Client Object Modelin çalışma yöntemini ifade eden grafikteki client.svc ile ifade
edilen çalışma anını görmekteyiz..
- Yine bu log kayıdın JSON tipinde response değerine baktığımızda Liste ile alakalı bilgilerin geldiğini görmekteyiz

- Uygulama kodunu incelemeye devam edersek ExecuteQuery’den önce Load metodunun çağrıldığını görüyoruz.. Sonuc Kümesini Yönetmek - Yukarıda ki örnekte Load() metodu ile listeyi yükleyeceğimizi belirttiğimizde listeye ait veri dönerken bazı alanlara (tüm alanlar değil) ait verinin döndüğünü görürürüz.Yukarıdaki fiddler ekranında JSON cevabındaki o alanları görmekteyiz.Bu şekilde bir Load() metodu çağırımı hem kullanmayacağımız alanları getirterek gereksiz network yükü olusturacak hem de asıl kullanmak istediğimiz alanları da getirmemiş olacaktır.

- Yukarıdaki örnekte liste verisi döndüğünde sadece Title ve Description alanlara ait veriyi istediğimizide Load metodunda => (lambda) ifadesi ile belirtmiştik olduk..

- Yukarıdaki ifade çalıştırdığımızda fiddler dönen cevapta aşağıdaki gibi olacaktır..

- Yukarıdaki örnekte eğer ResultSet’te olmasını belirtmediğimiz bir alana ait okumaya calışırsak PropertyOrFieldNotInitializedException hatası alırız..

Client Object Model ve CAML query - Client Object Model ile linq sorguları ve CAML sorguları yazarak sorgulama yapabiliriz.

-Burada dikkatimizi çekecek bir noktada Incluede metodudur.Include metodu ile yine ResultSet’te dönecek alanlarımızı belirtiyoruz..Eğerki sonuc kümesi bir kolleksiyon şeklinde değer döndürecekse bu durumda =>(lambda) ifadesini Include metodu içinde kullanarak Fieldlarımızı belirliyoruz.(Yukarıdaki örnekte olduğu gibi) ..Eğer sonuç kümesi bir kolleksiyon değilse =>(lambda) ifadesini Include metodu olmadan kullanıyoruz.. Bu makalemde Sharepoint 2010 ile gelen Client Object Modeli incelemeye çalıştım.

Sorularınız için bana serkan_akkaya@yahoo.com mail adresimden ulaşabilirsiniz.