Archive for the 'Entwicklung' Category

Jul 15 2010

Inhaltsdatenbanken wachsen schnell an

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…

Comments Off

May 25 2010

Schnelles löschen von Listenelementen

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;

Comments Off

Mar 29 2010

Timer Job Definition löschen

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.

Comments Off

Mar 22 2010

Ausführen von zeitintensiven Operationen im SharePoint

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);

Comments Off

Mar 17 2010

ListItem.Update() Security Exception

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();
    }
}

Comments Off

Mar 02 2010

Mit einem Forms Based SharePoint Webservice verbinden

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

Comments Off

Dec 14 2009

Sonderzeichen in XML (z.B. SiteDefinitions oder ListDefinitions)

Gleich wie beim HTML müssen im XML Sonderzeichen speziell formatiert werden. Anbei eine Auflistung der am meist gebrauchten:

&      &amp;
'      &apos;
<      &lt;
>      &gt;
"      &quot;
Ä      Ä
Ö      Ö
Ü      Ü
ä      &#228
ö      ö
ü      ü
ß      ß

Comments Off

Dec 10 2009

Feher beim Laden von Controlls

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);

Comments Off

Nov 18 2009

Security Exception beim Auslesen von Webs “site.webs()”

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
    }
});

Comments Off

Nov 16 2009

Alle Items in einer Liste löschen

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);

Comments Off