24 Haziran 2010 Perşembe

Sharepoint 2010'da Developer Dashboard

Sharepoint 2010 yeniliklerinden olan Developer Dashboard ile webpartlarımızın ve sayfanın ne kadar sürede yüklendiğini ve çalışan queryleri görebilmekteyiz.
Öncelikle Developer Dashboardu aktif hale getirmemiz gerekiyor.
Kod, Powershell veya stsadm ile aktif veya pasif duruma getirebilirsiniz.
Stsadm -o setproperty -pn developer-dashboard -pv ondemand
Stsadm -o setproperty -pn developer-dashboard -pv on
Stsadm -o setproperty -pn developer-dashboard -pv off

using (SPMonitoredScope ms = new SPMonitoredScope("Name"))
{
// your code
}

using içerisine yazacağınız kodun ne kadar sürede çalıştığını öğrenebilir ve webpartın bulunduğu sayfadan takip edebilirsiniz.
Aşağıda bununla ilgili örnek bulunmaktadır.

using (new SPMonitoredScope("My code block - DeveloperDashboard"))
{
using (new SPMonitoredScope("My first block - DeveloperDashboard"))
{
Thread.Sleep(10);
}
using (new SPMonitoredScope("My second block - DeveloperDashboard"))
{
Thread.Sleep(20);
}
using (new SPMonitoredScope("My third block - DeveloperDashboard"))
{
Thread.Sleep(30);
}
}
Developer Dashboardu aktif ettikten sonra aşağıdaki resimde de göründüğü üzere sayfanın sağ üst kısmında login olan kullanıcın adının bulunduğu yere bir buton yerleşmekte ve ona tıkladıktan sonra ilgili sayfanın altında tüm bilgiler gelmektedir ve kodumuzun ne kadar sürede çalıştığını sol menüde kırmızı ile işaretli alanda verdiğimiz isme göre listelendiğini ve iç içe olan kod bloğumuzun da iç içe listelenmekte olduğunu görebilirsiniz.Sayfamızda çalışan queryin ekran görüntüsü

15 Haziran 2010 Salı

Global Assembly Cache (GAC)'a assembly yüklenmesi

Daha önce Windows Server 2008 üzerinde Global Assembly Cache(GAC)'a assembly yüklenmesi başlıklı yazımda geliştirdiğimiz projenin dllini gac'a atmanın bi yolunu göstermiştim.
Çoğu kez bu yöntemle yükleme yaparken geçenlerde bu yöntemle dahi yapsam "access denied" hatası alıyor ve bir türlü yükleme yapamıyordum. Sistemde gacutil de yüklü olmayınca kendi çözüm yolumu kendi gacutilimi geliştirerek buldum :)

using System;
using System.EnterpriseServices.Internal;
using System.IO;
namespace MyGacutil
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Lütfen seçiminizi yapınız: Gac'a Yükleme(i), Gac'tan Silme(u)");
string secim = Console.ReadLine();
switch (secim)
{
case "i":
case "u":
GacInstallOrRemove(secim);
break;

default:
Console.WriteLine("Yalnızca i veya u seçilmelidir.");
break;
}

Console.ReadLine();
}

private static void GacInstallOrRemove(string secim)
{
Console.WriteLine("Gac'a yüklenecek dll'in olduğu adresi \"d:\\abc.dll\" şeklinde giriniz.");
string assemblyPath = Console.ReadLine();
bool assemblyExists = string.IsNullOrEmpty(assemblyPath) ? false : new FileInfo(assemblyPath).Exists;
if (assemblyExists)
{
if (secim == "i")
{
Console.WriteLine("Yükleme Başladı");
new Publish().GacInstall(assemblyPath);
Console.WriteLine("Yükleme Bitti");
}
else if (secim == "u")
{
Console.WriteLine("Silme Başladı");
new Publish().GacRemove(assemblyPath);
Console.WriteLine("Silme Bitti");
}
}
else
{
Console.WriteLine("Dll bulunamadı");
}
}
}
}


Yukarıdaki kodda da göreceğiniz üzere
System.EnterpriseServices.Internal.Publish
sınıfı ile Gac'a assembly yükleme ve silme işlemlerini yapabilmekteyiz.

7 Haziran 2010 Pazartesi

Linq To Sharepoint ve Anonim Kullanıcılar

Daha önce "Sharepoint 2010 Linq Anonim Kullanıcıları Desteklememekte" başlıklı yazımda LinqToSharepoint ile sorgu çekip geliştirdiğimiz webpartların anonim kullanıcılarda çalışmadığını anlatmış ve bir örnek yapacağıma değinmiştim. Bugün ufak bir örnek yaptım. LinqToSharepoint ile geliştirdiğim webpartın bulunduğu sayfaya maalesef anonim kullanıcı ile giriş yapamadım ve sayfa giriş yapmamı istedi. CAML ile sorgu atıp geliştirdiğim webpartın bulunduğu sayfada bir sıkıntı yoktu ve giriş yapmadan sayfamı gezebildim.
Aşağıdaki ekran görüntüsünde de görüldüğü üzere Linq ile geliştirdiğim webparta login olmak zorunda kaldım.

Entities.EntitiesDataContext dataContext = new Entities.EntitiesDataContext(SPContext.Current.Web.Url);
var musteriler = from musteriListesi in dataContext.Musteriler
where musteriListesi.Title.StartsWith("A")
select musteriListesi;
Repeater1.DataSource = musteriler.ToList();
Repeater1.DataBind();


Ancak CAML ile geliştirdiğim webpartda ise login olmadan sayfamda gezinti yapıp webpartlarım arasında bağlantıyı sağlayabildim.
Burada anonim kullanıcı ile giriş yapabildiğimizi göstersede daha olumsuz olan bir nokta ise "Linq to SharePoint for Anonymous users performance" ve "Linq to SharePoint for Anonymous users performance Part 2" yazılarında CAML ve Linq arasında yapılan performans testlerinin sonuçları.
Görünen o ki CAML ile webpart geliştirmeye devam edeceğiz.

Sharepoint Database Isim Standartları

Sharepoint'de yeni bir web application oluştururken default olarak bize veritabanı adı olarak WSS_Content_[GUID] olarak oluşturmakta ancak uygulama birden fazla web application ve birden fazla farma doğru gidip büyüyünce yönetim zorlaşmaması için veritabanı isim standartını
SharePoint_[Farm Name]_[Database Type]_[Name]
olarak yapmak en sağlıklısı olacaktır.
Veritabanı tiplerini;
  • Config
  • Content
  • WSSSearch
  • SSP
  • SSPSearch
olarak ayırabiliriz. Örnek olarak AdventureWorks projemiz için isimlendirmeleri şu şekilde yapabiliriz.



SharePoint_AWIntranet_Content_IntranetNameIntranet İçeriği
SharePoint_AWIntranet_SSP_DefaultSSPSSP Veritabanı
SharePoint_AWIntranet_SSPSearch_DefaultSSPDefault SSP Search Database

Detaylı bilgiyi buradan bulabilirsiniz.


3 Haziran 2010 Perşembe

Sharepoint 2010 Visual Web Part Connections With Ajax

Daha önce sharepoint 2010'da webpartlar arası bağlantı ile ilgili 2 yazı yazmıştım.
İlk yazımda visual webpartlar arası bağlantı kurup veri alışverişinde bulunmuştuk ancak sayfa postback olmaktaydı.
İkinci yazımda ise sayfa postback olmadan bağlantı sağlamıştım ancak burada da örnekte görüldüğü üzere sayfa üzerinde bulunacak kontrollerimizi dinamik olarak oluşturup sayfaya eklemiştik.

Daha önceki projelerimizde bu yöntemle webpart geliştirmekteydik ve bu yöntem hem bizim için meşakkatli hem de görsel açıdan çok sıkıntı oluşturmaktaydı. Bu yöntemi SmartPart ile bir nebze olsun aşmıştık ancak üçüncü parti yazılım olmasından ötürü aklımızda soru işaretleri oluşturmuştu. Kesin çözümü ise Sharepoint 2010 da yerleşik olarak gelen visual webpartı sayfaya ekleme yöntemini uzun süre kullandık.

Yukarıda webpart ekleme yöntemlerimizi kısa bir biçimde tekrar ettik. Aynı konu şimdi tekrar karşımızda :)
Yazdığım 2 yazıdaki konuları birleştirmek için düşünmeye başladığımda mesai arkadaşım yan masamda oturan Abdülkadir Culfa'ya da konuyu aktarıp üzerinde biraz kafa yorduktan sonra visual webpartlar arasındaki bağlantıyı ajax ile kontrolleri dinamik olarak eklemeden çözdük.

Kendi geliştirdiğimiz webparta geçmeden sharepoint bize sağladığı bağlantı yönteminin nasıl olduğuna bir bakalım.
Ben bu örnekte "Müşteriler" ve "Siparişler" olarak iki liste oluşturdum ve Sipariş listesi ile Müşteri listesinde Müşteriler listesinin ID kolonunu ortak kolon yaptım.
Yukarıda görüldüğü üzere oluşturduğum listeleri sayfama direk ekledim ve birbirleri ile bağlantıyı kurdum.

Burada da sayfa postback olmakta olduğunu yukarıdaki ekranda görmekteyiz.
Artık kendi geliştireceğimiz webpartlara geçebiliriz.
Öncelikle AjaxConsumer ve AjaxProvider webpartları oluşturalım.
"Müşteriler" ve "Siparişler" adında iki listem arasında Müşteriler listesinin ID kolonu ortak alan olarak kullanılmakta ve iki liste arasında ilişkiyi sağlamakta.
Provider webpartım siparişleri listelerken, consumer webpartım ise providerdan gelen MusteriIdsine göre müşterinin bilgileri listelemekte.
Burada dikkat etmemiz gereken nokta: Usercontrollerin designer kısmında sayfamızda bulunan kontrollerden Provider WebPartında Gridview kontrolünü ve Consumer WebPartında UpdatePanel kontrolünü public yapmamız olacaktır.

Public yaparak WebPartımızdan sayfamızdaki kontrollere ulaşabilmekteyiz.


Böylelikle sayfa postback olmadan visual webpartlarımız arası bağlantıyı sağlamış olduk.