Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Sharepoint 2010: Client object model & Silverlight - synchroner Ansatz

Eines, der für mich meist erwar­te­ten Features von Sharepoint 2010, ist das neue Client object model. Gerade hin­sicht­lich der Entwicklung von Silverlight Web Applikationen in Verbindung mit Sharepoint, erleich­tert es uns deut­lich die Arbeit. Bisher muss­ten umständ­lich Serveranwendungen geschrie­ben wer­den um dann per Sharepoint Webservices auf die API zurück zu grei­fen. Das Client object model zieht nun eine neue Abstraktionsschicht ein, um diese Zugriffe zu erleich­tern. Mit Hilfe des Client object models ste­hen fast alle Eigenschaften und Daten einer Site Collection zur Verfügung, so zum Beispiel der Zugriff auf Listen.

Das Client object model steht für nahezu alle Technologien zur Verfügung. Ob WPF, Forms Anwendungen, Silverlight oder Javascript.

  • für .NET cli­ents steht die  Microsoft.SharePoint.Client.dll im “14\ISAPI”  Ordner zur Verfügung
  • Für Silverlight cli­ents nutzt man die
    • Microsoft.SharePoint.Client.Silverlight.dll aus dem  “14\LAYOUTS\ClientBin” Ordner
    • Microsoft.SharePoint.Client.Silverlight.Runtime.dl aus dem “14\LAYOUTS\ClientBin” Ordner
  • Und für Javascript cli­ents die SP.js file aus dem  “14\LAYOUTS” Ordner

In die­sem ers­ten Überblick zeige ich wie das Client object model ver­wen­det wer­den kann, um Daten aus einer Sharepoint 2010 Liste aus­zu­le­sen. Das Auslesen der Daten soll in einer Silverlight Web Applikation statt­fin­den. Diese  soll nicht, wie in den meis­ten Beiträgen zum Client object model, in Form eines Sharepoint Webparts erstellt wer­den, son­dern außer­halb von Sharepoint lau­fen.

Voraussetzungen für die­ses Beispiel:

  • instal­lier­tes Sharepoint 2010 inkl. Silverlight 3
  • eine Sharepoint Liste mit Daten
    • In mei­nem Fall, meine Einkaufsliste

Los geht's:

1. Im ers­ten Schritt muss ein neues Silverlight 3 Projekt inner­halb von Visual Studio ange­legt wer­den. Zum Beispiel Silverlight 3 Navigation Application.

2. Die fol­gen­den bei­den DLLs wer­den als Referenz in dem Silverlight Projekt benö­tigt.

  • Microsoft.SharePoint.Client.Silverlight.dll
  • Microsoft.SharePoint.Client.Silverlight.Runtime.dll

Wenn Visual Studio 2010(Beta 2) ver­wen­det wird und nach dem Hinzufügen der bei­den DLLs ein klei­nes rotes Ausrufezeichen an der Referenz kle­ben sollte, habt ihr nichts falsch gemacht. Dabei han­delt es sich um einen Bug von Visual Studio 2010. Der Fehler ist in der Pfadtiefe des Projektes und der Silverlight DLLs begrün­det. Um den Fehler zu behe­ben habe ich das Projekt ein­fach unter C:\Projects gelegt.

3. Da sich Sharepoint 2010 und das Silverlight Projekt in einer unter­schied­li­chen Domain befin­den, wird der Zugriff auf den Client Context ver­wei­gert. Silverlight benö­tigt eine Clientaccesspolicy.xml Datei wel­che bestimmt, ob der Zugriff auto­ri­siert ist. Diese Datei muss sich im Rootverzeichnis des Webservers befin­den. Hier kom­men die domain policy hel­per von Tim Heuer ins Spiel. Innerhalb des Webprojektes der Silverlightanwendung wird eine XML Datei mit den Namen Clientaccesspolicy.xml erstellt.

In die­ser Datei wird das Snippet Menü via STRG+K+X auf­ge­ru­fen und das Silverlight Clientaccesspolicy.xml Snippet aus­ge­wählt. Der fol­gende Inhalt sollte erschei­nen.
Wichtig: Vor Verwendung der Datei muss ein IIS Reset erfol­gen.

blank

4. Auf der dar­stel­len­den Seite benö­ti­gen wir ein Anzeigeelement für die Listen Daten. Dazu emp­fiehlt sich ein Datagrid. Dieses kann, basie­rend auf einem Datenobjekt, seine Spalten dyna­misch gene­rie­ren.

<data:DataGrid AutoGenerateColumns="True" Height="200" Name="einkauf" Width="311" HorizontalAlignment="Left" />

Mit die­sem XAML Code wird ein Datagrid mit dem Namen "ein­kauf" erstellt, wel­ches auto­ma­tisch seine Spalten gene­riert.

5. Auf Basis der Sharepoint Liste wird ein Datenobjekt erstellt.

 public class EinkaufData
    {
        public string Title {get;set;}
        public string Preis { get; set; }
        public string Details { get; set; }
    }

Dieses wird benö­tigt um das "ein­kauf" Datagrid zu befül­len.

6. Basierend auf dem Datenobjekt wird eine Liste erstellt.

 private List einkaufList = new List();

7. Wie im Titel erwähnt, nutze ich in die­sem Beispiel die syn­chrone Datenübertragung. Für syn­chrone Anfragen wird die Methode ExecuteQuery() genutzt, für asyn­chrone ExecuteQueryAsync . ExecuteQuery darf nicht ein­ge­setzt wer­den, falls damit das Laden des User Interfaces beein­träch­tigt wird. Falls die Methode trotz­dem ver­wen­det wird, tritt fol­gende Exception auf.

InvalidOperationException. The method or property that is called may block the UI thread and it is not allowed.

Um die­ser Exception aus dem Weg zu gehen, wird die Methode LoadSharepointContext in einem Hintergrundprozess aus­ge­führt.

ThreadPool.QueueUserWorkItem(new WaitCallback(LoadSharepointContext));
private void LoadSharepointContext(Object stateInfo)
        {
 ClientContext clientCxt = new ClientContext("http://siteCollectionAdresse");
            List shoppingList = clientCxt.Web.Lists.GetByTitle("Einkauf");
            CamlQuery query = CamlQuery.CreateAllItemsQuery();
            ListItemCollection listItems = shoppingList.GetItems(query);
            clientCxt.Load(listItems);
            clientCxt.ExecuteQuery();

            foreach (ListItem item in listItems)
            {
                einkaufList.Add(new EinkaufData
                {
                    Title = item["Title"].ToString(),
                    Details = item["Details"].ToString(),
                    Preis = item["Preis"].ToString()
                });
            }
}

8. War das Laden des Sharepoint Kontextes erfolg­reich, sollte die einkaufList nun mit den Daten der Sharepoint Liste gefüllt sein.
Als letz­ter Schritt muss nun die Liste dem Datagrid als Quelle zur Verfügung gestellt wer­den. Dabei muss beach­tet wer­den, dass die Liste nicht im User Interface Thread befüllt wurde. Hier kommt der Dispatcher zum Zug.

Dispatcher.BeginInvoke(() =>
          {
             einkauf.ItemsSource = einkaufList;
          });

9. War alles erfolg­reich sollte das Datagrid wie folgt aus­se­hen.

blank

Tipp: Sollte ein Zugriff auf eine Eigenschaft eines SP Objektes erfol­gen, ohne die Query vor­her abge­setzt zu haben, erhält man die fol­gende Exception :
PropertyOrFieldNotInitializedException. Diese Exception tritt solange auf, bis eine Eigenschaft gela­den und die Query mit­tels ExecuteQuery abge­setzt wur­den ist.

Wie die asyn­chro­nen Anfragen an Sharepoint mit dem Client object model rea­li­siert wer­den, zeige ich im nächs­ten Blogeintrag.

Related Posts

[…] Es sind die Schritte 1. – 6. des Blogeintrages “Sharepoint 2010: Client object model & Silverlight – syn­chro­ner Ansatz” […]

#Sharepoint 2010: Client object model & #Silverlight – ansyn­chro­ner Ansatz http://ow.ly/XAIk #fb
This com­ment was ori­gi­nally pos­ted on Twitter

#Sharepoint 2010: Client object model & #Silverlight – syn­chro­ner Ansatz http://ow.ly/XAIw #fb
This com­ment was ori­gi­nally pos­ted on Twitter

[…] Dieser Eintrag wurde auf Twitter von Planet SharePoint und Torsten Hufsky, ase­an­tic erwähnt. ase­an­tic sagte: #Sharepoint 2010: Client object model & #Silverlight – syn­chro­ner Ansatz http://ow.ly/XAIw #fb […]

Sharepoint 2010: Client object model & Silverlight – asyn­chro­ner Ansatz
http://bit.ly/94KYk6
This com­ment was ori­gi­nally pos­ted on Twitter

Vielen Dank werte Kollegen, sehr nüt­zer­lich Beitrag :).

kann das ganze auch ana­log mit sil­ver­light 4 ange­wen­det wer­den?

wenn ich das rich­tig ver­stehe wird die gra­fik dar­über hin­aus auto­ma­tisch aktua­li­siert, sobald neue listen-elemente ein­ge­tra­gen wer­den?

Hallo,

ja das ganze ist ana­log mit Silverlight 4 anwend­bar. In der nächs­ten oder über­nächs­ten DotNetPro Zeitschrift erscheint dazu ein Artikel von mir. In die­sem habe ich ein ähn­li­ches Vorgehen mit Silverlight 4 erklärt. Die ListBox, in wel­cher die Elemente ange­zeigt wer­den, wird sofort aktua­li­siert sobald neue Element in die Liste ein­ge­tra­gen wer­den.

Vg,

Torsten

Comments are closed.

Pin It on Pinterest