22 Eylül 2010 Çarşamba

Debugging Linq

Linq sorguları yazarken yaşadığmız en büyük sıkıntı debug işlemi yaparken breakpointin sorgu içerisine girmemesi ve bu nedenle  düzgün testini yapamayışımız olmuştur.

Ancak sorgudaki kısmı yeni bir method içerine alarak sorgu içerisindeki verilerin kontrolü yapabilmekteyiz.

var customers = from customerList in dataContext.Customers
                where customerList.Title.StartsWith("M") == true
                select customerList;

Yukarıdaki sorguyu debug ederken kontrol edemiyorken

var customers from customerList in dataContext.Customers
                where IsStartingWith(customerList,"M")
                select customerList;

private bool IsStartingWith(CustomerItem customerListstring value)
{
    return customerList.Title.StartsWith(value) == true;
}

Yeni bir method ile kontrol edebiliyoruz artık.

HTTPContext in EventHandler

Listemizde item eklerken, ekledikten sonra vs. yapmak istediğimiz işlemler için veya filedlerdeki dataların kontrolü için EventReceiver geliştirebilir ve eklenen dataya göre işlemler yapabiliriz.

Sharepoint 2010 yeniliği olan validationlarla kolonlardaki kontrolleri sağlayabilir ve EventReceiver geliştirmeye gerek olmayabilir veya "Sharepoint 2010 Event Handler ve Hata Sayfası" başlıklı yazımda da belirttiğim üzere başka bir sayfaya yönlendirmek için

properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/MyCustomPage.aspx";

EventReceiver'ın statüsünü "CancelWithRedirectUrl" yaptıktan sonra yönelenicek sayfayı yazarak sayfa yönlendirmesi yapabiliriz.

Ancak sayfa yönlendirme yapmak istediğimizde SPUtility.Redirect methodunun çağırmak istediğimizde HttpContext tipinden bir parametre istemekte veya Response.Redirect methodunu bulamamaktayız bu sıkıntı yukarıdaki şekilde bir bakıma Sharepoint 2010 ile çözülebilirken MOSS 2007 de daha çok karşımıza çıkmaktadır.

EventReceiver'a HttpContext eklemeyi aşağıda bulabileceksiniz ancak onun öncesinde SPUtility.Redirect methodunun yönlendirme yapmadığını bundan dolayı Response.Redirect methodunu kullanmamız gerektiğini belirtmek isterim.

EventReceiverımızı oluşturduğumuz isimle aynı olacak şekilde base() den türetilecek bir method ve global oluşturacağımız HttpContext tipinden değişken ile bu işi çözebileceğiz :)

Bununla ilgili örnek kodu aşağıda bulabilirsiniz.
/// 
/// List Item Events
/// 
public class TestHttpContext : SPItemEventReceiver
{
    private HttpContext _currentContext = null;
 
    public TestHttpContext() : base()
    {
        if (null != HttpContext.Current)
        {
            _currentContext = HttpContext.Current;
        }
    }
 
    /// 
    /// An item is being added.
    /// 
    public override void ItemAdding(SPItemEventProperties properties)
    {
        base.ItemAdding(properties);
        string url = "http://www.yahoo.com/?n=" + _currentContext.User.Identity.Name;
        _currentContext.Response.Redirect(url);
    }        
}

14 Eylül 2010 Salı

Sharepoint 2010 Feature Activation in Visual Studio 2010

Bundan önceki yazılarımda ve 2010 yeniliklerinde en dikkat çeken husus visual studio 2010 ile sharepoint 2010'un birlikte çok güzel işler çıkartması olmuştur.
Bu yazımda Sharepoint 2010 projemizi deploy ederken featurların aktivasyonları ile ilgili visual studio içerisinde neler yapabileceğimiz olacaktır.

Yeni bir sharepoint projesi veya visual webpart oluşturduğumuzda projemize "Features" klasörü eklenmektedir.
Feature içerisinde nelerin olacağını proje yapınıza göre oluşturabilirsiniz.
Geliştirme ve deployment kolaylığı açısından Lists, ContentTypes, WebParts veya Modül bazlı olarak her birine yeni bir feature oluşturmak sizlere yönetim açısından rahatlık sağlayabilir.

Feature1 üzerindeyken F4 derseniz yalnızca Featureın adının yer aldığı properties ekranı gözükmektedir.
Ancak Feature1 e tıkladığımız da gelen ekran üzerinden F4 dediğinizde properties pencerisini açtığımızda Feature ile ilgili özellikleri görebilmekteyiz.
Bu ekranda "Activation on Default" seçeneği Web veya Site Scope bazında bir işlem yapmamakta yalnızca FarmScope seçili olduğunda ve yeni bir web oluşturulduğunda devreye girmektedir.

Bunun dışında feature aktifleştirme ile ilgili yapabileceğimiz diğer değişikliği projemizin özellikler ekranından görebilmekteyiz.
Burada default olarak gelen ekranda
Yükleme adımlarında "Activate Features" da seçili olduğundan featurelar aktif olarak yüklenecek.
Ancak
Default olarak gelen seçenekler içerisinden "No Activation" seçip yüklediğimizde Featurelar aktifleştirilmeyecektir.
İsterseniz proje özelliklerinin bulunduğu ekranda default gelenlerin dışında siz kendi yükleme adımlarınızı oluşturabilirsiniz.
Bu noktada proje yapısına göre hangi feature elle aktifleştirilmeli, hangisi deployment ile otomatik aktifleştirilmeli veya aktifleştirilmemeli önemli bir noktadır.
Bir bakmışsınız aktifleştirme yaparken proje ile daha önce yüklenen Sharepoint Listenizin uçtuğuna şahit olabilirsiniz!

1 Eylül 2010 Çarşamba

Lisans Tiplerine Göre Sharepoint 2010 WebPartlar

Faydalı bir paylaşımla daha tekrar buradayım :)
İlgili linkte her ne kadar custom geliştirme yapmaz Microsoftdaki abiler ne güzel geliştirmiş hatta testini de yapmış deselerde biz gene custom geliştirmeler ile projeler yapmaya devam ediyor ve edeceğiz!
Buradan lisans tiplerine göre farklılıkları ve hangi webpartın hangi lisans ile geldiğini görebilirsiniz.

SharePoint 2010 site templates

Sharepoint 2010 site templati oluşturma ve xsl güncellemeleri ile ilgili Yaroslav Pentsarskyy'in videosu ve videoda geçen kendi blog şablonumuzu oluşturduğumuz
örnek projeyi aşağıda bulabilirsiniz.
Yaroslav'un Vimeo'daki diğer videoları da izlemenizi tavsiye ederim.



örnek projeyi buradan indirebilirsiniz.

19 Ağustos 2010 Perşembe

div tagına onclick eventini ekleme

Html div tagına tıklanılabilir ve tıkladığında veri işlemesi yapması gereken bir tasarım sizin elinize ilk ulaştığında göreceğiniz ilk şey divin onclick eventinde çalışamayacağınızdır.
Fakat aşağıdaki yazılanları uyguladıktan sonra ise olabildiğini göreceksiniz :)
<div class="myclass" id="divSubmit" runat="server"> click me! div>
Sayfanın Load'ında divin onclick eventin referans atamasını yapıyoruz.
divSubmit.Attributes["onclick"] = Page.ClientScript.GetPostBackEventReference(this"divSubmit_Click");
İlgili sayfamıza veya usercontrolümüze IPostBackEventHandler interfacenin RaisePostBackEvent methodunu implement ediyoruz.
public partial class MyUserControl : System.Web.UI.UserControlIPostBackEventHandler
implement ettikten sonra ilgili methodun içerisine tıklanma anında yapılacak işlemi yazıyoruz.
#region IPostBackEventHandler Members
 
public void RaisePostBackEvent(string eventArgument)
{
    if (!string.IsNullOrEmpty(eventArgument))
    {
        if (eventArgument == "divSubmit_Click")
        {
            divSubmit_Click();
        }
    }
}
 
#endregion
protected void divSubmit_Click()
{
    // yapılacak işlemler
}
daha sonrasında yaptığımız işlemlerin düzgün şekilde çalıştığını görüp keyfimize bakıyoruz :)

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.


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.


4 Mayıs 2010 Salı

Windows 7 üzerine Sharepoint 2010 rtm kurulumu

Sharepoint 2010 ile gelen güzelliklerden en dikkat çekenlerden birisi olan windows 7 işletim sistemi üzerine sharepoint 2010 kurulumunu yapabiliyor olmamız ve geliştirmelerimizi windows 7 üzerinde yapabiliyor olmamızdır.
Moss 2007 ile geliştirmelerimizi server 2003 veya server 2008 üzerinde yapabiliyorken Sharepoint 2010 ile birlikte windows 7 üzerinde de geliştirme yapabileceğiz.

Aşağıda kurulum adımlarını geçtikten sonra Sharepoint 2010 rtm'i windows7 işletim sistemi üzerinde çalıştırabiliriz. Unutmamamız gereken bir konu var ki o da yalnızca geliştirme yapabilmek için Sharepoint 2010'u windows7 üzerine kuruyoruz.

1 - WCF Hotfix for Microsoft Windows (Windows6.1-KB976462-v2-x64.msu) - http://go.microsoft.com/fwlink/?LinkID=166231
2 - ADO.NET Data Services Update (Windows6.1-KB976127-v6-x64.msu) - http://www.microsoft.com/downloads/details.aspx?familyid=79d7f6f8-d6e9-4b8c-8640-17f89452148e&displaylang=en

Yukarıdaki dosyaları indirip kurduktan sonra SharePoint 2010 kurulumundan önce Sp2010'un ihtiyaç duyduğu kurulumları da yapıyoruz...

3 - Sharepoint 2010 kurulumunu yapacağımız dosya iso dosyası ise içerisindeki dosyaları c:\SharePointFiles içerisine kopyalıyoruz. Exe ise Command Prompt ile exenin içerisindeki dosyaları çıkartıyoruz.
c:\SharePointFiles\OfficeServer /extract:c:\SharePointFiles

4 - c:\SharePointFiles\files\Setup\config.xml içerisinde
<configuration>
tagı içerisine
<Setting Id="AllowWindowsClientInstall" Value="True"/>
ekledikten sonra dosyayı kaydediyoruz. Yukarıdaki şekilde aynen ekleme yapmalyız çünkü configuration dosyasında büyük harf küçük harf ayırımı bulunmakta.

5 - Microsoft FilterPack 2.0 Beta - Command Prompt u açıp c:\SharePointFiles\PrerequisiteInstallerFiles\FilterPack\FilterPack.msi yazıyoruz.

6 - Microsoft Sync Framework (Synchronization.msi) - http://go.microsoft.com/fwlink/?LinkID=141237

7 - SQL Server Native Client (sqlncli.msi) - http://go.microsoft.com/fwlink/?LinkId=123718

8 - Windows Identity Foundation (Windows6.1-KB974405-x64.msu) - http://support.microsoft.com/kb/974405

9 - Chart Controls (MSChart.exe) - http://go.microsoft.com/fwlink/?LinkID=122517

10 - SQL Server Analysis Services - ADOMD.Net (SQLSERVER2008_ASADOMD10.msi) -
http://download.microsoft.com/download/A/D/0/AD021EF1-9CBC-4D11-AB51-6A65019D4706/SQLSERVER2008_ASADOMD10.msi

6, 7, 8, 9 ve 10. adımları sırasıyla kurduktan sonra Windows Featurelarından IIS hizmetini açıyoruz.

11 -
start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;
IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;
IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;
IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-HealthAndDiagnostics;
IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ManagementScriptingTools;
IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;
IIS-RequestFiltering;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;
IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-IIS6ManagementCompatibility;
IIS-Metabase;IIS-WMICompatibility;WAS-WindowsActivationService;WAS-ProcessModel;
WAS-NetFxEnvironment;WAS-ConfigurationAPI;WCF-HTTP-Activation;
WCF-NonHTTP-Activation
Yukarıdaki komutu kopyalayıp Command Prompt'da çalıştırıyoruz. Komutu yapıştırmadan önce tüm komutun tek satırda olmasına dikkat ediniz!

12 - 11. adımdaki işlem bittikten sonra bilgisayarı yeniden başlatıyoruz. Aşağıdaki fotolardaki gibi ilgili yerler aktif duruma geçtiğini kontrol edebiliriz.

13 - Sharepoint 2010 kurulumu başlatıyoruz. Kurulum bittikten sonra Configuration Wizard çalıştırmıyoruz!!!

14 - Sql Server Cumulative Update 2 geçiyoruz. (SQLServer2008-KB970315-x64.exe)

15 - Configuration Wizard başlatıyoruz.

Daha detaylı bilgi için http://msdn.microsoft.com/en-us/library/ee554869%28office.14%29.aspx
adresini ziyaret edebilirsiniz.

22 Nisan 2010 Perşembe

Sharepoint 2010 Linq Anonim Kullanıcıları Desteklememekte


Daha önceki yazımda Linq To Sharepoint güzelliklerinden bahsedip bir örnek ile artık nasıl daha kolay daha güzel sorgular yazıp webpart geliştireceğimizi belirtmiştim.

Ancak bugün pek de güzel olmayan bir haber vermek için yazı yazmaktayım.
Waldek'in blogunda denk geldiğim yazıya göre anonim kullanıcıların gezebileceği yerlerdeki webpartlarımızda Linq yerine CAML sorguları yazmamız gerekecek.

Yazıda ufak bir örnek ile durumu açıklamış. Ben henüz bununla ilgili bir örnek yapmadım.
İlerleyen günlerde örnek yapıp karşılaştığım durumu belirteceğim.

Ayrıca ilgili yazıya yorum olarak katkı sağlayan Sezai'nin de belirttiği üzere
Clien Object Model ve Anonim giriş yapılabilecek yerlerde Linq yerine CAML sorguları yazmamız gerektiğini vurgulamış.

Bugün yüzümün asılmasına sebep olan haber olan Waldek'in yazısına buradan ulaşabilirsiniz.

13 Nisan 2010 Salı

Sharepoint 2010 Web Part Connections with Ajax


Buradaki yazımda Web Partlar arasında bağlantıyı anlattım ve örnek bir projeyi paylaşmıştım.
Bu yazımda ise postback olmadan webpartlar arasında bağlantı kuracağız.
Gene aynı şekilde ekran görüntüleri ile zenginleştirip örnek bir uygulamayı yazının sonunda bulabileceksiniz.
Projemize 2 adet webpart ekledikten sonra adlarını AjaxConsumer ve AjaxProvider olarak değiştiriyoruz.
Sonrasında bağlantıyı sağlayacak interface projemize ekliyoruz.

Prjemizi görüntüsü bu şekilde:

Interfacemize trigger controlümüzle beraber yakalanacak eventin hangisi olduğunu ve provider webpartımızdan consumer webparta gönderilecek datayı taşıyan propertylerimizi ekliyoruz.

Daha sonrasında Provider webpartımızda updatePanel, textbox ve button oluşturup bunları webpartımızın kontrollerine ekliyoruz.
Ardından provider webparta, IAjaxConnection interface implement ediyoruz.

Consumer webpartımıza da updatepanel ve textbox ekledikten sonra update panel triggerını ve gelen datayı textboxa atıyoruz.

Ardından projemizi deploy ediyoruz ve ajaxlı şekilde webpartlar arası bağlantımıızı sağlıyoruz.

örnek projeyi buradan indirebilirsiniz.

29 Mart 2010 Pazartesi

Windows Server 2008 üzerinde Global Assembly Cache(GAC)'a assembly yüklenmesi

Window Server 2003 üzerinde Global Assembly Cache(GAC)'a ilgili dll dosyasını sürekleyip bıraktığımızda GAC'a assembly yüklenmiş oluyordu.
Window Server 2008 ile aynı işlemi yapmak istediğimizde yükleme başarız oluyor ve aşağıdaki mesajı alıyoruz.
Eğer böyle bir hata ile sizde karşılaşırsanız yapmanız gerekenleri aşağıda belirtmekteyim.
  • Administrator olarak "command prompt" ekranını açıyoruz.
  • GAC'a yükleyeceğimiz dll'in bulunduğu klasörü açıyoruz. (explorer d:\projects\myApp)
  • Global Assembly Cache açıyoruz. (explorer c:\windows\assembly)
Administrator olarak iki klasörü de açtıktan sonra ilgili assembly'i GAC'a yükleyebiliriz.

Not: Window Server 2008 Enterprise service pack 2 üzerinde çalışılmıştır.

Sharepoint 2010 Web Part Connections

Bu yazımda Sharepoint 2010 ile ileri seviye web part geliştirmeye göz atarak web partlar arası bağlantıya değineceğim.
Örnek bir uygulama yaparak uygulamayı paylaşacağım.
2 Web Part (wp) geliştirerek biri veriyi gönderen diğeri ise veriyi alan wp olacak.

Deploy edeceğimiz site url yazarak visual web part projesi oluşturduktan sonra projemize VisualProvider ve VisualConsumer adları ile 2 wp ekliyoruz.

WebPartlarımıza textbox ve button ekliyoruz.

Ardından webpartlarımızı bağlayacağımız interface ekliyoruz.
Visual webpartlarımıza gönderdiğimiz datayı ekranda göstereceğimiz methodları yazıyoruz.
Daha sonrasında provider webpartımıza interface implement edip bağlantıyı oluşturuyoruz.
Consumer webpartında da bağlantı oluşturup gelen veriyi visualwebpartımıza gönderiyoruz.
Buradaki önemli nokta gelen verinin null kontrolü yapılmasıdır.
Projemiz deploy edip webpartlarımızı sayfaya ekledikten sonra provider ve consumer webpartlarımızı birbirine bağlıyoruz.
Vee bağlantı kuruldu :) Resmin üzerine tıklayarak açılan sayfada webpartlar arasındaki bağlantı görülebilir.

Örnek projeyi buradan indirebilirsiniz.

24 Mart 2010 Çarşamba

Sharepoint 2010 Event Handler ve Hata Sayfası


SP2007'de göstermek istediğimiz hata mesajını aşağıdaki şekilde yapıyorken

properties.ErrorMessage = "Hata Oluştu";
properties.Cancel = true;

artık Sharepoint 2010 ile birlikte daha düzenli ve kullanıcı dostu şekilde hata mesajını gösterebiliriz.

Öncelikle projemize EventReceiver ekliyoruz.


Ardından göstermek istediğimiz sayfayı "Application Page" olarak projemize ekliyoruz.


Sayfa eklendikten sonra içerisine uygun hata mesajımızı yazabiliriz.

EventReceiver'da kontrolümüzü yaptıktan sonra

properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/MyApp/ErrorPage.aspx";

oluşturduğumuz "Application Page" linkini hata oluşunca yönlenecek sayfa olarak belirtiyoruz.

16 Mart 2010 Salı

Exchange Server 2007 sp1 Sanal Makine


Exchange Web Servisleri ile ilgili çalışmaları yapabileceğiniz sanal makineyi bu adresten indirebilirisiniz.

Microsoft Exchange Server 2007 SP1 VHD


15 Mart 2010 Pazartesi

Sharepoint 2010 Taxonomy Referans Ekleme Sorunu


14\ISAPI altında Microsoft.SharePoint.Taxonomy dll referans olarak projemize eklemek istediğimiz zaman bize aşağıdaki gibi hata mesajı vermekte ve projemizi başarıyla build edememektedir.


Sharepoint 2010 beta ile gelen bu sorunu çözebilmek için önce
C:\Program Files (x86)\Microsoft Chart Controls\Assemblies\System.Web.DataVisualization.dll
referans olarak eklemeli ardından Microsoft.SharePoint.Taxonomy.dll ini projemize referans olarak eklemeliyiz.

Sharepoint Developer blogunda ve technetde de konu ile ilgili soru ve cevaba ulaşabilirsiniz.


Exchange Web Services (EWS) ile kullanıcının maillerini okuma


aşağıdaki kod ile litwareinc.com da hesabı buluna Adil'in
Inbox'ndaki emaillerin başlıklarını listeliyoruz.

private void GetEmails()
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate,
X509Chain chain, SslPolicyErrors errors)
{
return true;
};
System.Net.WebProxy proxyObject = new System.Net.WebProxy();
proxyObject.Credentials = CredentialCache.DefaultCredentials;
service.Url = new Uri("https://domain/ews/exchange.asmx");
service.UseDefaultCredentials = true;
Mailbox mb = new Mailbox("Adil@litwareinc.com");
FolderId fid1 = new FolderId(WellKnownFolderName.Inbox, mb);
FindItemsResults<Item> findResults = service.FindItems(fid1,
new ItemView(int.MaxValue));
foreach (var item in findResults)
Response.Write(item.Subject + "<br />");

}


Exchange Web Services (EWS) ile toplantı odalarını listeleme


Bir önceki yazımda gelen kullanıcının bulunduğu toplantıları listelemiştik. Bu yazımda ise yalnızca kullanıcı ile kısıtlı kalmayarak bütün toplantı odalarını ve dolu olan saatleri listeleyeceğiz. Ben burada ayrı ayrı yazacağım siz kullanacağınız yere göre değiştirir veya bir araya getirsiniz.
İlk önce toplantı odalarının adı ve eposta adreslerini listeyeceğim.
using System.DirectoryServices;
ekledikten sonra toplandı odasının adını ve eposta adresini tutacağım class yazıyoruz.

public class RoomMailbox
{
public string Email { get; set; }
public string DisplayName { get; set; }
}

ardından da örnek kod aşağıda.
private List<RoomMailbox> GetRooms()
{
List<RoomMailbox> listRoomMailbox = new List<RoomMailbox>();
string sqSearchQuery = "(&(&(&(mailNickname=*)(objectcategory=person)(objectclass=user)(msExchRecipientDisplayType=7))))";
SearchResultCollection srSearchResults;
string roRootDSE = "ldap bağlantı adresi";
DirectoryEntry deDirectoryEntry = new DirectoryEntry(roRootDSE);
DirectorySearcher dsDirectorySearcher = new DirectorySearcher(deDirectoryEntry);
dsDirectorySearcher.SearchScope = SearchScope.Subtree;
dsDirectorySearcher.Filter = sqSearchQuery;
dsDirectorySearcher.PropertiesToLoad.Add("mail");
dsDirectorySearcher.PropertiesToLoad.Add("displayName");
srSearchResults = dsDirectorySearcher.FindAll();
foreach (SearchResult srSearchResult in srSearchResults)
{
listRoomMailbox.Add(new RoomMailbox
{
DisplayName = srSearchResult.Properties["displayName"][0].ToString(),
Email = srSearchResult.Properties["mail"][0].ToString()
}
);
}
return listRoomMailbox;
}


msExchRecipientDisplayType=7 toplantı odalarını getirmek için 7 yazdık.
"ldap bağlantı adresi" kısmına ldap adresiniz yazmanız gerekmekte.
Aşadağıda da gelen kullanıcın yetkileri ile Exchange Web Servislerini kullanarak
ilgili toplantı odasının dolu olan saatlerini listeleyelim.
Ben burada örnek olarak 1 adet toplantı odasının(Akdeniz) dolu olan saatlerini getiriyorum.
Ancak siz yukarıdaki kod ile birleştirerek bütün toplantı odalarının dolu olan saatlerini getirebilirsiniz.

Web servisine bağlanabilmemiz tüm sertifika izinleri için gerekli namespaceleri eklemeyi unutmayalım.

using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;


private void GetCalendarByMailBox()
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate,
X509Chain chain, SslPolicyErrors errors)
{
return true;
};

System.Net.WebProxy proxyObject = new System.Net.WebProxy();
proxyObject.Credentials = CredentialCache.DefaultCredentials;
service.UseDefaultCredentials = true;
service.Url = new Uri("https://domain/ews/exchange.asmx");

Mailbox mb = new Mailbox("Akdeniz@litwareinc.com");
FolderId fid1 = new FolderId(WellKnownFolderName.Calendar, mb);
FindItemsResults<Appointment> findResults = service.FindAppointments(fid1,
new CalendarView(DateTime.Now.AddDays(-5), DateTime.Now.AddDays(5)));

foreach (Appointment appointment in findResults)
{
if ((appointment.AppointmentState & 4) != 4)
Response.Write(appointment.Subject + "<br />");
}

}

yukarıdaki kodda bulunan önemli bir nokta da

if ((appointment.AppointmentState & 4) != 4)

kontrolü yapmamızdır. Bu kontrol ile cancel edilmiş toplantı odalarını getirmiyoruz.
Buradaki makalede açıklamasını bulabilirsiniz.

Exchange Web Services (EWS)

Bu yazımda Exchange 2007'de Exchange Web Servisleri ile toplantı odalarını getirme örneği paylaşacağım.

İlk önce burada bulunan Exchange Web Services Managed API indiriyoruz ve %programfiles%\Microsoft\Exchange\Web Services\1.0 klasörü altındaki Microsoft.Exchange.WebServices.dll referans olarak projemize ekliyoruz.
using Microsoft.Exchange.WebServices.Data;
ekledikten sonra aşağıdaki örnek kod ile Exchange 2007 üzerinde bulunan toplantı odalarının ilgili kişi ile ilişkili dolu olan saatlerini gösterebiliriz.

private void GetCalendarByUser()
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate,
X509Chain chain, SslPolicyErrors errors)
{
return true;
};

System.Net.WebProxy proxyObject = new System.Net.WebProxy();
proxyObject.Credentials = CredentialCache.DefaultCredentials;
service.Credentials = new WebCredentials("username", "password", "domain");
service.Url = new Uri("https://domain/ews/exchange.asmx");

CalendarFolder myCalendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar);
FindItemsResults myAppointments = myCalendar.FindAppointments(new CalendarView(DateTime.Now.AddDays(-5), DateTime.Now.AddDays(5)));
foreach (Appointment appointment in myAppointments)
Response.Write(appointment.Subject + ", ");
}



27 Ocak 2010 Çarşamba

Sharepoint Modal Dialog Box

Sharepoint 2010 ile gelen yeniliklerden bir tanesi de DialogBox'dır.
Dialog Box; Öğenin detaylarını gösterme, güncelleme vs işlemleri gibi birçok işlemi Popup pencere şeklinde açarak ajax desteğiyle daha esnek ve güzel yapıda göstermektedir.
14 klasörü altında \TEMPLATE\LAYOUTS klasöründe bulunan .js dosyalari ile bu işlemi gerçekleştirebiliriz. Oluşturacağımız Dialog Options'a ait
  • width,
  • height,
  • dialogReturnValueCallback,
  • url,
  • x,
  • y,
  • title,
  • allowMaximize,
  • showMaximized,
  • showClose,
  • autoSize
parametrelerine değer atayabiliriz. Bu parametrelerin varolan değerleri bulunduğundan hepsini kullanmamıza gerek bulunmamaktadır.
DialogBox gösterme işlemini yapabilmek için birden fazla yol bulunmaktadır. Ben bunlardan bir tanesi ile yaptığım örneğe aşağıda yer verdikten sonra kısaca anlatacağım.
<script type="text/javascript">
function openDialog(ID, Title) {
function demoCallback(dialogResult, returnValue) {
SP.UI.Notify.addNotification('Haberler!');
SP.UI.ModalDialog.RefreshPage(SP.UI.DialogResult.OK);
}
var options = {
url: '/sites/adil/Lists/Haberler/DispForm.aspx?ID=' + ID,
title: Title,
allowMaximize: false,
showClose: true,
width: 800,
height: 600,
dialogReturnValueCallback: demoCallback
};
SP.UI.ModalDialog.showModalDialog(options);
}
</script>

<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<a href='' onclick='openDialog(<%# Eval("ID") %>, "<%# Eval("Title") %>");return false;'>
<%# Eval("Title") %></a>
<br />
<%# Eval("Açıklama") %>
</ItemTemplate>
</asp:Repeater>


Oluşturduğumuz VisualWebpart ile "adil" adlı sitenin altındaki "Haberler" Liste'sinden haberleri listeleyip, Haber detaylarını DialogBox ile "url" ve "title" alanı dinamik gösterilecek şekilde oluşturduk.

DialogOptions'ı oluşturup ilgili parametrelere değerlerini atadım.
"SP.UI.Notify.addNotification" ile de DialogBox kapanıp ilgili sayfaya dönüşünde "Operation Successful!" yazısı gibi

"Haberler!" yazısı çıkarttım.


25 Ocak 2010 Pazartesi

InfoPath 2010 ile Sharepoint List Formlarını özelleştirme

Sharepoint 2010 ile gelen yeniliklerden bir tanesi de oluşturduğumuz listeleri MS InfoPath 2010 ile birlikte tasarımı değiştirebiliyor ve rule tanımlayabiliyor olmamızdır.
Gelin resimlerle zenginleştirdiğimiz bir örnek ile detaylandıralım.

Çalışanların Listesinin tutulduğu "Çalışanlar" adlı liste oluşturalım.
Ad, Soyad, Email, Dahili, Mezuniyet fieldlarını oluşturularım.
Görüntü aşağıdaki gibi sade gözükmektedir.

Aşağıdaki ekran görüntüsünde görüleceği üzere Customize Form diyerek InfoPath üzerinden listemiz tasarımında değişiklik yapmaya başlayabiliriz.

İlk anda bu şekildegelen form tasarımımız üzerinden oynamaya başlayabiliriz :)

Page Design sekmesinden InfoPath 2010'un bize sunduğu templatelar arasından sarı renkli olanı seçerek form tasarımımı değiştirdim.

İstersek bütün formumuzu silerek kendi oluşturacağımız tablo üzerine listemize ait olan fieldlerin listelendiği sağ kısımdaki ilgili alanları tablomuz üzerine koyarak kendi tasarımımızı da oluşturabiliriz.

Yaptığımız değişikliklerden sonra File menusü altinda Publish diyerek formumuzun yeni halini yayına sunuyoruz.
InfoPath 2010 ile Rule Tanımlama:

Formda bulunan Email alanına düzgün formatta email adresi yazılıp yazılmadığının kontrolünü yapalım.
InfoPath 2010 Properties sekmesinin altında Add Rule diyerek veya Manage Rules dedikten sonra açilan Rules tabından rule oluşturabilir ve oluşturduğumuz ruleleri yönetibiliriz.
Eklediğimiz Rule'un Condition'una patternlerden emaili seçiyor ve ScreenTip alanına da uyarı mesajımızı yazıyoruz.

Rule tanımladıktan sonra formumuzu tekrar yayınlıyoruz. Email alanı uygun formatta değilse

ekrandaki gibi uyarı mesajı vermektedir.

Channel 9 daki videoyu izlemenizi, Customize a SharePoint List Form ve InfoPath 2010 Customize List diyerek arama yapmanızı tavsiye ederim.