Jul
15
2010
Problem:
Inhaltsdatenbanken im SharePoint wachsen in kurzer Zeit sehr schnell an (.mdf und .log Files). Dies obwohl das Backup auf simple gestellt wurde.
Ursache:
Durch grosse Änderungen an Listen (häufig verursacht durch “Custom Timer Jobs) wird die Inhaltsdatenbank stehts vergrössert und leider nicht automatisch wieder verkleinert.
Unter folgendem Link ist dieser Effekt noch detailierter beschrieben:
http://blogs.technet.com/b/damodar/archive/2009/03/12/why-a-content-database-grows-abnormally.aspx
Lösung:
Folgt noch…
May
25
2010
Wie bereits behandlet, lohnt es sich mit dem Batch-Kommando zu arbeiten, wenn eine grosse Anzahl von Listenelemente gelöscht werden soll. Weiter möchte ich anfügen, dass es ebenfalls von Vorteil ist, während der Prozedur den Recycle Bin zu deaktivieren. Dies sparrt enorm viel Zeit.
web.Site.WebApplication.RecycleBinEnabled = flase;
// Task
web.Site.WebApplication.RecycleBinEnabled = true;
Mar
29
2010
Problem:
Timer Jobs können von der Zentraladministration aus nur deaktiviert werden, jedoch nicht gelöscht. So kann sich, meist in der Entwicklung, eine Menge Schrott ansammeln.
Lösung:
Verwenden Sie den stsadm um einen TimerJob zu löschen.
1: stsadm -o deleteconfigurationobject -id <ObjectID>
Die ObjectID representiert die ID des zu löschenden Jobs. Diese kann in der Zentraladministration unter Timer Job Definitions gefunden werden. Einfach mit der Maus über den gewünschte Job fahren und ID aus dem Link entnehmen.
Mar
22
2010
Problem:
Wird in einem Webpart sehr zeitintensiver Code ausgeführt, kann dies zu einem TimeOut führen.
Lösung:
Mit der Klasse “LongRunningOperationJob” (Microsoft.SharePoint.Publishing) können zeitintensive Operationen durchgeführt werden. Dies wird wie folgt angewendet.
public class IntensivJobClass : LongRunningOperationJob
{
…
Überschreiben Sie in der Klasse “IntensivJobClass” die Methode DoWork().
public override void DoWork()
{
this.StatusDescription = “What going on
”;
this.UpdateStatus();
this.OperationsPerformed++;
IntensivJob();
}
private void IntensivJob()
{ … }
Nun können Sie diesen Job aus dem Webpart per Event starten
IntensivJobClass intensivJob = new IntensivJobClass();
intensivJob.Title = “Lange Operation”;
intensivJob.WaitMessage = “Bitte warten Sie…”;
intensivJob.RedirectWhenFinished = true;
intensivJob.UserCanCancel = true;
intensivJob.TotalOperationsToBePerformed = 1;
intensivJob.GearsImageUrl = “~/layouts/images/gears_an.gif”;
intensivJob.MillisecondToWaitForFinish = 500;
intensivJob.StatusDescription = “…”;
intensivJob.Start(SPContext.Current.Web);
HttpContext.Current.Response.Redirect(job.StatusPage.Url);
Mar
17
2010
Problem:
Beim Erstellen eines ListItems nach folgender Methode wird beim Update() Befehl eine Sicherheits-Exception ausgelöst: Exception : “The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation again.”
SPSite site = new SPSite("URL");
site.AllowUnsafeUpdates = true;
SPWeb web = site.OpenWeb();
web.AllowUnsafeUpdates = true;
SPList list = web.Lists["Name"];
SPListItem item = list.Items.Add();
item["Titel"] = "Test";
item.Update();
Lösung:
Dieses Problem tritt in der Regel auf, wenn eine grosse Anzahl Elemente in einer Liste erstellt werden soll. Mittels using (die Gültigkeit des Objekts auf einen Bereich zu beschränken) kann das Problem abgefangen werden.
using(SPSite site = new SPSite("URL"))
{
site.AllowUnsafeUpdates = true;
using(SPWeb web = site.OpenWeb())
{
web.AllowUnsafeUpdates = true;
SPList list = web.Lists["Name"];
SPListItem item = list.Items.Add();
item["Titel"] = "Test";
item.Update();
}
}
Mar
02
2010
Problem:
Sie möchten auf einen SharePoint-Webservice zugreifen. Die SharePoint Site wurde jedoch mit FBA (Forms Based Authentication) realisiert und somit erhalten Sie stets Security-Exceptions.
Lösung:
Authentifizieren Sie sich zuerst mittels dem Webservice "/_vti_bin/Authentication.asmx" und erstellen sie ein Cockie welches Sie beim Zugriff auf den gewünschten Webservice einsetzen.
Quellen:
Unter folgendem Link finden Sie weitere Erläuterungen sowie ein Beispiel Programm.
1: // Web Referencen einbinden
2: using ... .WSAuthentication;
3: using ... .WSLists;
4:
5:
6: // Authenticate
7: Authentication spAuthentication = new Authentication();
8: spAuthentication.Url = ".../_vti_bin/Authentication.asmx";
9: spAuthentication.CookieContainer = new CookieContainer();
10: LoginResult loginResult = spAuthentication.Login("user", "password");
11: Cookie cookie = new Cookie();
12:
13:
14: // Webservice laden
15: Lists wsLists = new Lists();
16: wsLists.Url = ".../_vti_bin/lists.asmx";
17:
18: // Login
19: CookieCollection cookies = spAuthentication.CookieContainer.GetCookies(new Uri(spAuthentication.Url));
20: cookie = cookies[loginResult.CookieName];
21: wsLists.CookieContainer = new CookieContainer();
22: wsLists.CookieContainer.Add(cookie);
23:
24:
25: // nun können Sie auf den Webservice zugreifen
Dec
14
2009
Gleich wie beim HTML müssen im XML Sonderzeichen speziell formatiert werden. Anbei eine Auflistung der am meist gebrauchten:
& &
' '
< <
> >
" "
Ä Ä
Ö Ö
Ü Ü
ä ä
ö ö
ü ü
ß ß
Dec
10
2009
Problem:
Beim Entwickeln eines SharePoint-Webparts tritt beim Laden der Seite ein Fehler auf. Wird der Prozess mit dem Visual Studio angebunden um in Debug-Modus zu wechseln, kann kein Exception gefunden werden.
Ursache:
Bei dynamisch erzeugten Contolls wird keine eindeutige ID zugewiesen. So ist es möglich, dass zwei Controlls die gleiche ID haben. Dieser Fehler wird nicht durch den Compiler und im Debug-Modus sichtbar, sondern erst beim Laden der Seite.
Lösung :
Weisen Sie jedem Control eine Eindeutige ID zu. Am Besten funktioniert dies wie folgt:
Button cmdOK = new Button();
cmd.Text = "OK";
cmd.ID = Guid.NewGuid().ToString();
...
Controls.Add(cmdOK);
Nov
18
2009
Problem:
Beim Auslesen von Webs aus einer Site kann ein Sicherheits-Issue auftretten.
Ursache:
Mit der Methode .webs() gibt SharePoint alle Webs aus der Site zurück. Da jedoch bei einem Webpart die Abfragen mit der Berechtigungsstufe des momentan angemeldeten Users durchgeführt werden. Tritt beim Zugriff auf das SPWeb Objekt eine Exception auf.
Lösung :
Um dieses Problem zu umgehen muss beim Auslesen von Webs wie folgt vorgegangen werden:
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
foreach(SPWeb subWeb in webCollection)
{
// Handlung
}
Nachtrag:
Falls Sie jedoch das Auslesen der Webs erzwingen möchten können Sie das auch mit Impersonating erledigen. Ddie “RunWithElevatedPrivileges” Methode erlaubt Code mit Full Control auszuführen.
SPSecurity.RunWithElevatedPrivileges(delegate()
{
foreach(SPWeb subWeb in web.Webs)
{
// Code
}
});
Nov
16
2009
Um alle Elemente in einer Liste im SharePoint zu löschen kann folgender Code verwendet werden:
SPListItemCollection listItemColl = list.Items;
foreach (SPListItem item in listItemColl)
{
list.GetItemById(item.ID).Delete();
}
Nachtrag
Da im Objekt SPList mit dem Befehl .Items immer alle Elemente zurückgegben werden, kann diese Methode bei grossen Listen (Elemente > 2000) zu Exceptions vom Typ OutOfMemory führen. Deshalb empfiehlt es sich stets mit einem Query Elemente aus Listen abzufragen. Ebenso sollten Sie die Liste in mehreren Schritte und mittels Batch löschen.
SPQuery query = new SPQuery();
query.RowLimit = 100;
do
{
// getItems
SPListItemCollection items = web.Lists[setList].GetItems(query);
// Batch erstellen
StringBuilder batchString = new StringBuilder();
batchString.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>");
foreach (SPListItem item in items)
{
batchString.Append("<Method>");
batchString.Append("<SetList Scope=\"Request\">" + Convert.ToString(item.ParentList.ID) + "</SetList>");
batchString.Append("<SetVar Name=\"ID\">" + Convert.ToString(item.ID) + "</SetVar>");
batchString.Append("<SetVar Name=\"Cmd\">Delete</SetVar>");
batchString.Append("</Method>");
}
//close the batch section
batchString.Append("</Batch>");
//preform the batch
web.ProcessBatchData(batchString.ToString());
query.ListItemCollectionPosition = items.ListItemCollectionPosition;
} while (query.ListItemCollectionPosition != null);