XPath: Namespace Manager or XsltContext needed

Bir xml belgesi üzerinde node'ların içeriğine ulaşmak/değiştirmek istediğinizde başvuracağınız temel yöntemlerden biridir XPath.

XPath belirteceğiniz selector'a göre DOM üzerinde istediğiniz node(lar)'a ulaşmanızı sağlar. Eğer xml belgenizde tag'lar için tanımladığınız custom prefix'ler varsa ve bunlara aşağıdaki gibi bir kod ile ulaşmak istediğinizde:

string value = _xmlDocument.SelectSingleNode("//my:ContactHome_Province").Value;

şu hatayı alırsınız:
"SelectSingleNode Error: Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

Bu hatanın sebebi "<my:contacthome_province>" tag'ındaki "my" prefix (öneki)'idir.

Bunu aşmanın yöntemlerinden birisi hata mesajından da görüleceği üzere prefix'lerinizi tanımlayan bir Namespace Manager veya XsltContext kullanmaktır.

İkinci yöntem ise Javascript'ten aşina olduğumuz "getElementsByTagName" metodunu kullanmaktır. "getElementsByTagName" namespace veya xslt tanımlamasını gerektirmeyen (namespace, xslt bağımsız) bir selector'dır. Tahmin edileceği üzere geriye bir array döndürür ve "SelectSingleNode" metodundan farklı olarak içeriğindeki veriye "Value" attribute'u ile değil "InnerText" veya "InnerHtml" attribute'u ile ulaşılır.

string value = _xmlDocument.GetElementsByTagName("my:ContactHome_Province")[0].InnerText;

Dikkat edilecek diğer bir husus "SelectSingleNode" metodunda "//" ekinin DOM üzerinde "my:ContactHome_Province" söz dizimine uyan bir tag'ı belirtirken, "GetElementsByTagName" metodunda buna gerek olmayışıdır.

Javascript Lazy Loading

Web uygulamalarında istemci (client) tarafında yapılacak bazı küçük işlemlerle yoğun trafik alan sistemlerde sayfanın daha hızlı yüklenmesini (browser tarafında daha erken render edilmesini) sağlayabilir ve arkaplandan geri kalan dosyalarınızı yüklemeye devam edebilirsiniz. Böylece ziyaretçilerinizi mevcut sayfa ile daha erken ilgilenmeye başlar ve canları sıkılmamış olur. Örnek senaryoda yoğun trafik alan finans servisiniz için her 30 saniyede bir verileri güncelleyen javascript kod bloğunu sayfa yüklendikten sonra yükleyip çalışmasını sağlayabiliriz. Bunun için window.onload event'ine yüklemeyi başalatacak olan fonksiyonunuzu register edip sayfa yüklendikten sonra yüklenmeye başlamasını sağlayabiliriz. Sayfa yüklendikten sonra yapılan bu sonraki yüklemelere "Lazy Loading" adını vermekteyiz. Örneği basit bir kod ile açıklayalım;


window.onload = function() {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.language = "javascript";
script.type = "text/javascript";
script.src = "refreshRates.js";
head.appendChild(script);
}


"refreshRates.js" dosyanızın içeriği browser sayfanızı render ettikten sonra DOM'a yeni bir child element olarak eklenip arkaplandan yüklenerek milisaniyeler (bu süre dosyalarınızın boyutuna göre değişir) oranında olsa da sayfanın daha hızlı yüklenmesine katkı sağlayacaktır.

SPSecurity.RunWithElevatedPrivileges'ı Doğru Kullanmak

SharePoint üzerine yazılım geliştirirken bazen geçici olarak kullanıcıya sahip olduğundan daha fazla bir yetki ile bir kod bloğunu çalıştırma izni vermeniz gerekebilir. Bu özellikle anonymous erişime açtığınız sayfalardan veri alış-verişi esnasında sıkça yapılan bir olaydır. Örneğin belirli bir listeye item ekleme işlemi için yetkisi olmayan kullanıcıdan alınan verileri o anda çalışmakta olan thread için “Sharepoint\system” account’una impersonate edebilirsiniz.

SPSecurity.RunWithElevatedPrivileges’ı kullanırken Current Site’ı içine alarak kullanmak yapılan temel yanlışlardan biridir. Çünkü current site thread’i zaten anonymous yetkisi ile yüklenmiştir. Örneğin:


SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite site = SPControl.GetContextSite(this.Context))
{
// kod bloğu buraya
}
});


Anonymous yetkisi ile yüklenen o anki thread’i “SPSecurity.RunWithElevatedPrivileges” bloğu içerisine almak ona “Sharepoint\system” yetkisi atamayacaktır. Bunun yerine “SPSecurity.RunWithElevatedPrivileges” kod bloğu içerisinde yeni bir SPSite instance’ı oluşturup gerekli işlemleri onun içerisinde yapmak sorunu çözecektir. Yukarıdaki kodun değişmiş şekli ise:



SPSecurity.RunWithElevatedPrivileges(delegate()
{
using(SPSite site = new SPSite(SPContext.Current.Site.ID))
{
SPWeb spWeb = site.AllWebs["/"];
// kod bloğu buraya
}
});