8 Temmuz 2010 Perşembe

Linq To Sharepoint ile alt sitede bulunan veriye üst siteden ulaşabilmek

Yukarıdaki çizimde de görüleceği üzere http://sps2010 sitemde bulunan webpartdan http://sps2010/sites/mavi sitemde bulunan listeye bağlanıp Müşterileri çekmek istemekteyim ancak Mavi adlı siteme bağlanamamakte ve "Web at http://sps2010/sites/mavi/ could not be found." hatası vermektedir.Bağlantıyı sağlayamayan örnek kod aşağıdaki gibidir:

using (EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext dataContext = new EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext("http://sps2010/sites/mavi/"))
{
var musteriler = from musteriListesi in dataContext.Musteriler
orderby musteriListesi.Title
select musteriListesi;
if (musteriler != null)
{
lvMusteriler.DataSource = musteriler.ToList();
lvMusteriler.DataBind();
}
}
Ancak HttpContext'i bağlanmak istediğimiz siteye set ettikten sonra herhangi bir sorun yaşamamakta ve Müşterileri listeleyebilmekteyim.Bağlantıyı sağlayan örnek kod aşağıdaki gibidir:
HttpContext currentContext = HttpContext.Current;

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite("http://sps2010/sites/mavi/"))
{
using (SPWeb web = site.OpenWeb())
{
HttpRequest httpRequest = new HttpRequest("", web.Url, "");
HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));
SPControl.SetContextWeb(HttpContext.Current, web);
using (EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext dataContext = new EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext("http://sps2010/sites/mavi/"))
{
var musteriler = from musteriListesi in dataContext.Musteriler
orderby musteriListesi.Title
select musteriListesi;
if (musteriler != null)
{
lvMusteriler.DataSource = musteriler.ToList();
lvMusteriler.DataBind();
}
}
}
}
});
HttpContext.Current = currentContext;
Mavi adlı siteme bağlantıyı gerçekleştirip Context'i değiştirdikten sonra bir sorunla karşılaşmadım.
Dikkat edilmesi gereken nokta kodun en üst ve en alt satırında da görüldüğü üzere CurrentContext'i bağlantı yapılmadan önce tutmak ve işimiz bittikten sonra tekrar atamak.

SPMetal ile Entity kodumu Mavi adlı siteden çıkarttım bunun sebebi de Müşteriler listemin orada bulunmasından dolayıdır.

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.