30 Mart 2009 Pazartesi

401 Unauthorized

sharepoint web servislerine bağlanış şeklimi "Sharepoint Web Service ile kullanıcı profil bilgilerini okuma" başlığı altındaki yazımda


MyUserProfileWebService.UserProfileService myUserService = new
MyUserProfileWebService.UserProfileService();
myUserService.Credentials = System.Net.CredentialCache.DefaultCredentials;

şekilde göstermiştim.

Bu noktada bağlanmaya çalıştığımda 401 Unauthorized hatası aldım.
Aynı hatayı ilgili siteme "u2u caml query builder" da "Connect via SharePoint Web Services" şeklinde bağlanmaya çalıştığımda da almaktaydım bu sebeple yalnızca "Connect via Object Model" ile bağlantı kurup CAML sorgularımı oluşturabiliyordum.

Çözüm için yaptıklarım :

- web.config'de <identity impersonate="true"/>
- myUserService.Credentials = new NetworkCredential("userName", "password", "domain");
admin hakkına sahip kullanıcı belirttim.

Fakat hala hata almaktaydım.
Araştırmalarım ve soruşturmalarım bir netice vermiyor ve tüm denemelerimde 401 hatasını aşamıyordum.
Biraz dinlenip bi çay içdikten sonra son çabalarımda bir çıkış yolu bulmuştum.

- Start -> Run regedit yaz ve OK.
- Aşağıdaki anahtara gittim.
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
- MSV1_0'e sağ tık -> New -> Multi-String Value.
- BackConnectionHostNames olarak isim verdikten sonra ENTER diyoruz.
- BackConnectionHostNames'e sağ tık -> Modify tıklıyoruz.
- webservisiyle bağlanmaya çalıştığım domaini yazdım.(Blue ve http://Blue)

domain adlarım renklerden oluşmakta :)

uygulayıp Server2003 kurulu makinemi yeniden başlattım ve 401 Unauthorized sorunu ortadan kalkmış web servisine bağlanabilmiştim.

25 Mart 2009 Çarşamba

Teknoloji ve Çevre

Bugün sizlerle 3 tane haber paylaşmak istemekteyim.
  • Haberlerde izlediğim "robot balık" yüzümde tebessüme neden oldu.
    Üzerindeki kimyasal alıcılar ile suyun kirlilik oranını ölçen ve oran yüksek çıktığı zamanda kablosuz bağlantı ile bulunduğu noktayı merkeze haber vermesiyle o bölgenin temizlenmesiyle robot balığımız çevreye katkı sağlamakta.
    1 tanesi için yaklaşık 50.000 lira harcanan bu balıklardan şu an sadece 5 adet bulunmakta.Eğer testlerde istenilen sonuçlar alınırsa seri üretime geçileceği bildirildi.


  • 28 Mart 2009 Cumartesi 20:30 da 1 saat süre ile ışıklarımızı söndürüyoruz.
    Neden söndüreceğiz peki?
    Cevabı basit: iklim değişikliği ile ilgili "Earth Hour" (Dünya Saati) eylemine katkı.





  • Bir diğer haber de;
    Akçokoca'da deniz dalgalarından elektirik üretimine başlamışız.
    Günaydın ve hayırlı olsun derim.Temiz ve sessiz bir elektrik üretimi.
    Şu an günde, bir evin bir günlük elektrik ihtiyacı kadar elektrik üretimi var.En azından güzel bir başlangıç oldu.


Bu haberleri neden sizlerle paylaştım?
Daha önce Enerji etiketiyle göreceğiniz üzere enerji ile ilgili yazılar yazmıştım.
Bu yazımda onlardan biri olmakla birlikte teknolojiden de faydalanıldığı ve bizim de buna ayak uydurmamız gerektiğine inancım olduğu için.

ilk haberi incelersek : robot, bir balık gibi deniz içerisinde gezinmekte.Üzerindeki kimyasal alıcılar ile bulunduğu suyu ölçmekte ve merkeze haber vermekte.
Ayrıca şarjı azaldığında bitmesine yakın kendisine en yakın adaptöre gidip kendini şarj edebilmekte.
Bu proje Avrupa Birliği tarafından da desteklenmekte ve oradaki fonlar ile yapıldığı söylenmişti haberde. Bu proje için ister AB fon desteğiyle ister özel bir firma desteği ile yapılsın bir önemi yok.
Önemli olan neden bizler güzel bir proje ortaya sunup, buna destek aramıyoruz.Görüyoruz ki yapmak istedikten sonra AB fonları gibi fonlar bizleri beklemekte :)

ikinci haber için fazla diyecek birşey yok maksat insanları uyandırmak ve dikkat çekmek.

üçüncü haberi incelersek : kullanılan aletler tamamen Türk yapımı olması bizi gururlandıran nokta.

20 Mart 2009 Cuma

Sharepoint Web Service ile kullanıcı profil bilgilerini okuma


aşağıdaki kod blogu ile sharepoint web servislerini kullanarak
kullanıcı profil bilgilerine erişebilmekteyiz.


Sharepoint Web Service'lerinden http://DomainAdı/_vti_bin/userprofileservice.asmx referans olarak eklememiz gerekmekte.





private string UserProfile(string pAccountName, string pFieldName)
{
string FieldValue = null;
MyUserProfileWebService.PropertyData[] userProps = null;
MyUserProfileWebService.UserProfileService myUserService = new MyUserProfileWebService.UserProfileService();
myUserService.Credentials = System.Net.CredentialCache.DefaultCredentials;

try
{
userProps = myUserService.GetUserProfileByName(pAccountName);
if (userProps != null || userProps.Length > 0)
{
for (int i = 0; i < userProps.Length; i++)
{
MyUserProfileWebService.ValueData[] values = userProps[i].Values;

if (userProps[i].Name == pFieldName)
{
if (values.Length > 0)
{
FieldValue = values[0].Value.ToString();
}
}
}
}
}
catch (Exception ex)
{
// exception anında yapılacak işlemler yapılır.
}

return FieldValue;
}


yukarıdaki kodla anonim kullanıcıyla da kullanıcı profil bilgilerine erişim sağlamış oluyoruz.

19 Mart 2009 Perşembe

anonymous user ile kullanıcı profil bilgilerini okuma


Bir önceki yazımda "web partları anonim erişime uygun şekilde geliştirmeliyiz" demiştim.
Böyle dememin nedeni: Geliştirdiğimiz web partlardaki login olmamış kullanıcıların görmemesi gereken alanları göstermemektir ki
bunu da Context.User.Identity.IsAuthenticated ile kontrol edebiliriz.

Ayrıca eğer WebPartınızda kullanıcı profil sayfasına erişim varsa anonim kullanıcı ile erişmeye çalıştığınızda hata ile karşılacaksınız.

Hata ile karşılaşmayarak kullanıcı profilinden veri okumak
istediğimizde object model ve Sharepoint WebServiceleri karşımıza çıkmakta.

Burada hangisini kullanacağınız size kalmış bir durumdur.Altı çizilmesi gereken bir durum var ki o da web servislerinin daha hızlı olduğu ve tavsiye edildiğidir.

Object Model ile kullanıcı bilgilerine erişmek



private string GetUserProfileFieldValue(string pName, string pFieldName)
{
HttpContext currentContext = HttpContext.Current;
string FieldValue = null;

try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb web = site.OpenWeb("/"))
{
ServerContext context = ServerContext.GetContext(site);
HttpContext.Current = null;
UserProfileManager profileManager = new UserProfileManager(context);
string[] n = pName.Split(';');
SPUser user = web.AllUsers.GetByID(Convert.ToInt32(n[0].ToString()));
UserProfile userProfile = profileManager.GetUserProfile(user.LoginName);
if (userProfile != null)
{
FieldValue = userProfile[pFieldName].Value.ToString();
}
}
}
});
}
catch (Exception ex)
{
// exception anında yapılacak işlemler yapılır.
}
HttpContext.Current = currentContext;
return FieldValue;
}


Yukarıdaki kod bölümü ile anonim kullanıcı ile profil bilgilerine ulaşabilmekteyiz.
Gelin satır satır kodumuzu inceleyelim.



private string GetUserProfileFieldValue(string pName, string pFieldName)
{
// o anki current context'i tanımladığımız context'e atıyoruz.
HttpContext currentContext = HttpContext.Current;

// geri donecek değerin tutulacağı değişkenimiz.
string FieldValue = null;

try
{
// Full Control sağlamak içib RunWithElevatedPrivileges kullandık.
// Bakınız
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// current sitemızı Id ile kullanıma alıyoruz.
using (SPSite site = new SPSite(SPContext.Current.Site.ID))// Microsoft.Sharepoint.dll
{
// root webe erişiyoruz.
using (SPWeb web = site.OpenWeb("/"))
{
// kullanıcı profilinden veri okuyabilmemiz için gerekmekte.
// Microsoft.Office.Server.dll referans edilmelidir.
// C:\Program Files\Common Files\microsoft shared\web server extensions\12\ISAPI klasöründe bulabilirsiniz.
ServerContext context = ServerContext.GetContext(site);

// contextimizi null'a çekiyoruz.
HttpContext.Current = null;

// sitemize ait olan kullanıcı profiline erişim sağlıyoruz.
UserProfileManager profileManager = new UserProfileManager(context);

// Sharepoint'den SPListItem tipinden değer aldığınız takdirde kullanıcı bilgileri
// 1;#Adil ERKAN şeklinde kullanıcı Id'si ve adı ile birlikte size değer gelecektir.
// Burada Id'ye göre değer okuyacağımız için split ile ayırıyoruz.
string[] n = pName.Split(';');

// AllUser's altındaki parametre ile gelen kullanıcının id'sine göre bilgilerini alıyoruz.
SPUser user = web.AllUsers.GetByID(Convert.ToInt32(n[0].ToString()));
// GetUserProfile ile kullanıcının LoginName'ile bilgilerini UserProfile tipindeki değişkenimize atıyoruz.
UserProfile userProfile = profileManager.GetUserProfile(user.LoginName);

// kullanıcı profili varsa parametre ile gelen alanın değerini geri dönen değişkemize atıyoruz.
if (userProfile != null)
{
FieldValue = userProfile[pFieldName].Value.ToString();
}
}
}
});
}
catch (Exception ex)
{
// exception anında yapılacak işlemler yapılır.
}

// methodumuzun başında atadığımız context'i iade ediyoruz.
HttpContext.Current = currentContext;

// değeri döndürüyoruz
return FieldValue;
}



referans : SharePoint User Profile Access Issues

Bir sonraki yazımda Sharepoint Web Service yardımı ile kullanıcı profil erişimini nasıl yapacağımızı yazacağım.

Bir Shapoint sitesini Anonymous Access (Anonim Erişime) Açmak



Sharepoint portal üzerindeki bilgileri anonymous access'e açmak için Central Administrator'da anonim erişime izin vereceğiniz web application'ın Authentication providers'da ilgili alanı işaretlememiz yeterli olacaktır.



Central Administration -> Application Management -> Authentication Providers burada sağ üst köşede yapacağıamız değişikliğin uygulancağı web applicatiın'ımızı seçiyoruz. -> Resim'deki altı çizili alan olan Enable anonymous access işaretliyoruz.



Geliştirmenizi bu doğrultuda yapmanız kullanıcı hakları ve güvenlik açısından önemli bir noktadır.
Giriş yapmış ve yapmamış kullanıcıların görebileği yerlerdeki ayarları ve web partları anonim erişime uygun şekilde geliştirmeliyiz.



12 Mart 2009 Perşembe

Xsl Date Format


Content Query Web Part(CQWP) kod veya custom webpart yazmadan, oluşturduğumuz Liste'lerdeki öğeleri göstermek için kullandığımız webpart'dır.

CQWP görselliği ayarlamak için;
Sharepoint Designer XSL Style Sheets altında yer alan ItemStyle.xsl içerisindeki xsl:template'ler


CQWP edit modda aşağıdaki gibi listelenmektedir.

Listeleme şeklimizi kendi istediğiz şekilde değiştirebiliriz.
ItemStyle.xsl'e kendi görselliğimize uygun olacak şekilde yazabiliriz.

xsl:template'in name alanına kendi template adımızı yazıyoruz.
Bu ad CQWP edit modda Presentation tabı, Styles başlığı altında Item style DropDownList'inde gözükecektir.

yukarıda kısaca CQWP'dan bahsettim.

Gelelim konumuz olan DateFormat'a.
Xsl içerisinde

<xsl:value-of disable-output-escaping="no" select="ddwrt:FormatDate(string(@Created), 1055, 5)" />

tagı ile Created öğemizi istediğimiz formatda gösterebiliyoruz.

xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"

namespacemizi xsl dosyamıza ekliyoruz.

Ayrıca 1055 Locale ID (LCID) Türkçe'dir ve Türkçe tarih formatını göstermektedir.
Dil ayarlarınız Türkçe olsa dahi 1055 yazmak zorundayız.
Diğer Local ID'leri bu linkten bulabilirsiniz.



yaralandığım blog adresi : Sharepoint Tips And Tricks