Merhaba arkadaşlar, daha önceden ihtiyacınız olduğu zaman araştırdığınız zaman görmüş olabilirsiniz ya da yeni araştırıyorsanız ve bilginiz yoksa haberiniz olsun SharePoint Online üzerinde SharePoint Server Side gibi direk dll userinden SharePoint UserProfile servisini kullanamıyoruz ve bundan dolayı SharePoint online üzerinde direk olarak sharepoint kullanıcılarına erişip onları alamıyoruz.
Peki sharepoint online tarafında kullanıcıları çekmek ya da kullanıcı özelliklerine ihtiyacınız olduğu zaman nasıl yapacağız. Bu kısımda da yardımımıza search yetişmektedir. Search yapısını kullanarak direk sharepoint kullanıcıları üzerine sorgu atabilir ve istediğiniz kullanıcılar ve özelliklerini alabilirsiniz. Buradaki tek dez avantaz kullanıcılarda güncellenen değerlerin güncel olarak gelmesi SharePoint Online tarafındanki search yansıma hızına göre size de yansıması gecikecektir.
İlk olarak visual studio üzerinde açmış olduğunuz konsol uygulamamıza gerekli olan referanslarımızı ekliyoruz.
- Microsoft.SharePoint.Client ( Version : 16.0.0.0 )
- Microsoft.SharePoint.Client.Runtime ( Version : 16.0.0.0 )
- Microsoft.SharePoint.Client.Search ( Verison : 16.0.0.0 ) — Not: Direk referanslar arasında aradığınız da bulamayabilirsiniz. Referans eklerken arama butonuna tıklayıp Microsoft.SharePoint.Client dosya konumuna gidip oradan seçerek eklemeniz gerekecektir.
- System.Configuration ( Version : 4.0.0.0 ) — Bu referans ise App.config dosyasından AppSettings ile online erişim bilgilerimizi dinamik olarak alabilmemiz için.
Projemize yukarıdaki referanslarımızı ekledikten sonra App.config dosyamıza giderek kullanacağımız dinamik verilerimizi burada tanımlamamız gerekiyor.
1 2 3 4 5 |
<appSettings> <add key="SharepointOnlineUrl" value=""/> <add key="SharepointOnlineUserEmail" value=""/> <add key="SharepointOnlineUserPassword" value=""/> </appSettings> |
- SharepointOnlineUrl : Sharepoint online site url adresi
- SharepointOnlineUserEmail : Sharepoint online kullanıcı email adresi
- SharepointOnlineUserPassword : Sharepoint online kullanıcı şifresi
Bu verileri value içinde bağlantı bilgilerini yazarak dosyamıza ekliyoruz. Daha sonra Program.cs dosyamıza gelerek kodumuzu yazmaya başlıyoruz.
İlk olarak App.config dosyamıza yazdığımız bilgileri okuyarak değişkenlerimize atamasını yapıyoruz.
1 2 3 |
string SharePointOnlineUrl = ConfigurationManager.AppSettings["SharepointOnlineUrl"].ToString(); string SharePointOnlineUserLoginName = ConfigurationManager.AppSettings["SharepointOnlineUserEmail"].ToString(); string SharePointOnlineUserPassword = ConfigurationManager.AppSettings["SharepointOnlineUserPassword"].ToString(); |
Bu değerleri okuduktan sonra kullanıcılarımızdan alacağımız bilgileri bir model ile yada tek bir bilgi ile mi alacağımıza göre bir liste oluşturuyoruz. Burada ben sadece gelen kullanıcıların “WorkEmail” property alanlarını alacağım için bana model değil string bir liste yeterli gelecektir.
1 |
List<string> SharePointSearchUserList = new List<string>(); |
Bundan sonraki adımda ClientContext ile sharepoint online sitemize bağlanarak işlemlerimize devam etmemiz kaldı. Bu aşamadan sonraki işlemler clientcontext içerisinde geçeceği için using ile clientcontext kod aralığımızı oluşturuyoruz ve tüm kodumuzu bu alan içerisinde yazmaya devam ediyoruz.
1 2 3 4 |
using (ClientContext clientContext = new ClientContext(SharePointOnlineUrl)) { // Code } |
Sitemize tam olarak erişebilmek için kullanıcı adı ve şifre ile online sitemize login olmamız gerekmektedir. Aşağıdaki kod ile bu işlemi yapıyoruz. Bununla ilgili detaylı blog yazımı okumak için tıklayınız.
1 2 3 4 5 |
SecureString passWord = new SecureString(); foreach (char c in SharePointOnlineUserPassword.ToCharArray()) passWord.AppendChar(c); clientContext.Credentials = new SharePointOnlineCredentials(SharePointOnlineUserLoginName, passWord); |
Sitemize giriş yaptıktan sonra KeywordQuery kullanarak search query mizi oluşturarak sorgu atmamız gerekecektir.
Bu nokta da dikkat etmemiz gereken bir nokta ise tek sefer de bir sorgudan bize en fazla 500 tane sonuç dönmektedir. Sizin sorgu sonucunuz bu sayıdan fazla olacak ise burada bir daha sorgu atarak gelecek sonucun başlangıç indexinin önceki çektiğimiz verilerin son verinin indexi olması gerekmektedir. bunun içinde KeywordQuery query imize StartRow diye bir değişkende atamamız gerekmektedir.
Burada genellkle gelecek sayı her zaman bilinemez ve her ihtimale göre çalışabilmesi için ben while kullanarak son gelen datanın 500 den küçük sayıda olana kadar devamlı sorgu atmasını sağlayıp gelen sayıya bağlı olmadan sorunsuz şekilde tüm verimi çekebileceğim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
int searchCount = 0; int cs = 500; while (cs > 499) { cs = 0; KeywordQuery query = new KeywordQuery(clientContext); query.QueryText = "RefinableInt00:1"; // Change your user filter query query.SourceId = new Guid("B09A7990-05EA-4AF9-81EF-EDFAB16C4E31"); query.RowLimit = 500; query.StartRow = searchCount; SearchExecutor search = new SearchExecutor(clientContext); ClientResult<ResultTableCollection> results = search.ExecuteQuery(query); clientContext.ExecuteQuery(); foreach (var resultRow in results.Value[0].ResultRows) { SharePointSearchUserList.Add(Convert.ToString(resultRow["WorkEmail"])); cs++; } searchCount += cs; } |
Buradaki kodu açıklayacak olursak;
- searchCount : Bu parametre bizim eğer gelecek sonucumuz 500 den büyük ise bir sonraki sorgumuz da hangi indexten başlayacağımızı tutacağımız değişken olacaktır. İlk olarak sıfır dan başlayacağı için ilk değeri sıfır olarak tanımlanmıştır.
- cs : Bu parametre ise bizim o anki sorgumuzdan gelen sayının bir sonraki sorguya ihtiyacımız olup olmayacağını anlamamız için kullanacağımız bir değişken. Ben değeri sınırda tuttuğum için ve ehile koşulum en az 500 olması gerektiği için ilk değerimi 500 olarak tanımlıyorum. Sonrasında while döngüsüne girer girmez bu değişkeni sıfırlıyorum ki o anki sorguda gelecek olan verilerimin sayısını tutabileyim. Birde her gelen sayı içinde bu değişkenimi bir değer arttırıyorum. Gelen değer sayım bittiğinde 500 den küçükse eğer daha sorgu atmama gerek kalmadığını anlayıp while döngüsünden çıkacağım.
- QueryText : Burada sharepoint search için yapacağım sorguyu text olarak tanımlıyorum. Ben burada RefinableInt00 user profile propetrisinin 1 olan kullanıcıları için filtreliyorum. Bu kısım sizin ihtiycınıza ve sorgunuza göre değişecektir.
- SourceId : Burada benim sorgu atacağım ve ihtiyacım olan veri türü sharepoint user profile people olduğu için ona uygun id yi guid olarak veriyorum. Bu Source Id değerlerini ve çeşitliliği için yazdığım blog yazısı için tıklayınız.
- RowLimit : Bu kısım yapacağınız sorguda gelmesini istediğiniz öğe sayısını belirtiyorsunuz. Dediğim gibi eğer 500 limitine takılmak istemiyorsanız ve bu yapıyı kullanacaksanız buraya cs değişkeninin ilk değerini tanımlamanız gerekmektedir. Ondan dolayı bende 500 olarak tanımladım.
- StartRow : Bu değişken ise eğer birden fazla sorgu atacak iseniz bu alanda sonraki sorguların hangi indexten başlayacağını belirteceğimiz parametreyi vermemiz gerekecektir. Bunun için tanımlamış olduğumuz searchCount değişkenini buraya tanımlıyoruz.
Daha sonraki aşamada SearchExecutor ile searchümüzü oluşturup oluşturduğumuz query imizi buraya execute ediyoruz. Bize ResultTableCollection modelinde bir sonuç dönmektedir ve burada yukarıdaki gibi bir foreach ile istediğimiz kullanıcı özelliğini alabiliriz. Ben “WorkEmail” property sini almak istediğim için onu belirttim.
Gördüğümüz gibi bu şekilde herhangi birşeye takılmadan generic bir şekilde kodumuzu tamamlıyoruz ve istediğimiz gibi user profile üzerinden verilerimizi çekebiliyoruz.
Bu kodun tamamını GitHub adresinden indirebilirsiniz.
İlk Yorumu Siz Yapın