sharepoint api nightmares
DESCRIPTION
This presentation was given by Donald Hessing of VX company as part of the Sparked Toolkit Session: SharePoint Nightmares.TRANSCRIPT
SharePoint API NightmaresGebruik Dispose() anders wordt SharePoint boos!
Donald Hessing
Wie ben ik? Donald Hessing, VX Company Microsoft Certified
– (MCAD, WSS & MOSS) SharePoint Architect, Spreker en Auteur
– SharePoint 2007 (WSS & MOSS)– Service Oriented Architecture (SOA)– Silverlight 2 / 3
SharePoint Object Model Krachtig voor het maken van custom solutions De classes zijn wrappers van unmanaged code
– SPSite, SPWeb, SPList, etc Goed gebruik van SharePoint object model is niet
eenvoudig
Niet Disposen van SPWeb en SPSite resulteert in:– Out of Memory Exceptions (OOME)– Slechte performance / veel resources– Onterecht Disposen Slechte performance
Voorbeeld
using (SPWeb rootWeb = SPContext.Current.Site.RootWeb) { foreach (SPWeb innerWeb in rootWeb.Webs) { foreach (SPList list in innerWeb.Lists) { if (list.Items.Count > 0) {
ProcessLatesItem(list.Items[list.Items.Count - 1]); } } } } // automatically called
Potentially excessive number of SPRequest objects (number of objects) currently
unreleased on thread number of thread.
Gebruik: SPDisposeCheck.exe
Dispose - Algemeen Gebruik Dispose op alle SPSite en SPWeb objecten
die je zelf creëert Dispose geen SPSite en SPWeb objecten van
SPContext en SPControl– SPContext.Current.Site– SPContext.Current.Site.RootWeb– SPControl.GetContextWeb(httpContext)– SPControl.GetContextSite(httpContext)
Dispose SPWeb object van SPSite.AllWeb.Add Dispose SPWeb object van SPSite.AllWebs[0] Pas op met recursieve functies
web.Lists[“Pages”] != web.Lists[“Pages”]web.Lists[“Pages”] == web.Lists[“Pages”]
1 Anti-Pattern
Anti-Pattern SPList[]
1: web.Lists[“Events”].EnableAttachments = false;2: Web.Lists[“Events”].Update();
SPList object in regel 1 is niet dezelfde als het SPList object van de tweede regel!
1: SPList list= web.Lists[“Events”]; 2: list.EnableAttachments = false; 3: list.Update();
1
Anti-Pattern SPList.Items
Tonen van items uit een lijst
SPList activeList = SPContext.Current.List;for(int i=0;i<100 && i<activeList.Items.Count;i++) {
SPListItem listItem = activeList.Items[i];ShowTitle(listItem["Title"].ToString());
}
2
Improved-Pattern
SPListItemCollection items = SPContext.Current.List.Items;
for(int i=0;i<100 && i<items.Count;i++) {
SPListItem listItem = items[i];ShowTitle(listItem["Title"].ToString());
}
2
Best-Pattern
SPQuery query = new SPQuery();query.RowLimit = 100;SPListItemCollection items =
SPContext.Current.List.GetItems(query);for (int i=0;i<items.Count;i++) {
SPListItem listItem = items[i]; ShowTitle(listItem["Title"].ToString());}
2
Anti-Pattern SPList.Items Elke aanroep van .Items haalt alle items op uit de
database. Niet nodig indien:– SPList.Items[0], SPList.Items.Count– SPList.Items kan geen gebruik maken van indexen
SPList.Items kan een lock leggen op de database Indien nodig, bewaar SPList.Items in een variabele
Gebruik SPQuery voor data in een List Gebruik SPSiteDataQuery over List objecten heen
– Gebruik de RowLimit property van het Query object
2
Performance32
Anti-Pattern SPList.Items[].Delete
Verwijderen van Items in een “Large List” is kostbaar– 1) Extra kostbaar wanneer de site onder load is– 2) Markeer listitems als “verwijdert” – 3) Maak een job die de items verwijdert buiten piektijden
MOSS Publishing Item Schedueling is OOTB Alternatief is het asynchroon verwijderen van items
3
SharePoint API ASP.NET ontwikkelaars zonder SharePoint kennis Veel functionaliteit kan bereikt worden dmv OOTB
functionaliteit. – ContentQueryWebPart– Search– Navigation
Gebruik een generieke Data Access Layer voor het ophalen van SharePoint content items
Links Best Practices using Disposable objects in SharePointhttp://msdn.microsoft.com/en-us/library/aa973248.aspx SharePoint Dispose Patternshttp://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx#SPDisposeCheckID_220Understanding SPRequesthttp://hristopavlov.wordpress.com/2009/01/19/understanding-sharepoint-sprequest/ SPDisposeChecker toolhttp://code.msdn.microsoft.com/SPDisposeCheck White paper: Working with large lists in SharePointhttp://technet.microsoft.com/en-us/library/cc262813.aspx