Im vorangegangenen Blogbeitrag über das Client object model, habe ich beschrieben wie mittels Context.Executequery() eine synchrone Anfrage an den Sharepoint Server abgesetzt werden kann. In diesem Eintrag werde ich das Gegenstück Context.ExecuteQueryAsync() etwas näher beleuchten. Es ist etwas verwirrend, dass Microsoft hier zwei Methoden anbietet, um Anfragen an Sharepoint zu senden. Als ich erstmalig die Methode ExecuteQuery() aufgerufen habe, erhielt ich eine Exception, welche mir mitteilte, dass ich diese Methode nicht in einem UI Thread aufrufen darf.
InvalidOperationException. The method or property that is called may block the UI thread and it is not allowed.
Aus diesem Grund, muss bei Verwendung der Methode ExecuteQuery(), in einem UI Prozess, ein Thread gewählt werden, welcher das UI nicht beeinträchtigt.
ThreadPool.QueueUserWorkItem(new WaitCallback(LoadSharepointContext));
Nach einer kurzen Suche bin ich auf die Erklärung der MSDN gestoßen.
The Silverlight client object model provides both an ExecuteQuery() method, which can be called synchronously from threads that do not modify the user interface (UI), and an asynchronous ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) method for cases where threads do modify the UI
Soll das Laden der Sharepoint Daten in einem User Interface Thread erfolgen, muss also zwingend die Asynchrone Methode verwendet werden. Falls der Programmcode keine Änderung an der UI vornimmt, kann weiterhin die synchrone Methode verwendet werden. Wie die asynchrone Query zu verwenden ist, zeige ich im nachfolgendem Beispiel.
Voraussetzungen für dieses Beispiel:
Die Voraussetzungen für dieses Beispiel sind analog der, des ersten Blogeintrages:
Los geht’s:
1. Es sind die Schritte 1. – 6. des Blogeintrages “Sharepoint 2010: Client object model & Silverlight – synchroner Ansatz” auszuführen.
2. Die Abarbeitung der Query varriert jedoch zu dem synchronen Ansatz.
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.ExecuteQueryAsync(new ClientRequestSucceededEventHandler(OnSuccess), new ClientRequestFailedEventHandler(OnFailed));
Wie zu erkennen, wird diesmal die Methode “ExecuteQueryAsync” aufgerufen. Diese benötigt als Paramater einen ClientRequestSucceededEventHandler sowie einen ClientRequestFailedEventHandler. Beide werden wie folgt erzeugt:
private void OnSuccess(Object sender, ClientRequestSucceededEventArgs args)
{
}
private void OnFailed(Object sender, ClientRequestFailedEventArgs args)
{
}
3. Bei erfolgreicher Abarbeitung der Anfrage, sollte diese im Successhandler landen, wo die weitere Verarbeitung der Daten stattfinden kann.
private void OnSuccess(Object sender, ClientRequestSucceededEventArgs args)
{
foreach (ListItem item in listItems)
{
einkaufList.Add(new EinkaufData
{
Title = item["Title"].ToString(),
Details = item["Details"].ToString(),
Preis = item["Preis"].ToString()
});
}
}
4. Achtung: Die Verarbeitung in OnSuccess findet in einem separaten Thread statt (nicht UI Thread). Nimmt man Änderungen an dem User Interface vor, muss der Dispatcher verwendet werden.
disp.BeginInvoke(() =>
{
dataGrid.ItemsSource = einkaufList;
});
5. Ist alles erfolgreich geladen, sollte das Datagrid wie folgt aussehen.
Eines, der für mich meist erwarteten Features von Sharepoint 2010, ist das neue Client object model. Gerade hinsichtlich der Entwicklung von Silverlight Web Applikationen in Verbindung mit Sharepoint, erleichtert es uns deutlich die Arbeit. Bisher mussten umständlich Serveranwendungen geschrieben werden um dann per Sharepoint Webservices auf die API zurück zu greifen. Das Client object model zieht nun eine neue Abstraktionsschicht ein, um diese Zugriffe zu erleichtern. Mit Hilfe des Client object models stehen 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.
In diesem ersten Überblick zeige ich wie das Client object model verwendet werden kann, um Daten aus einer Sharepoint 2010 Liste auszulesen. Das Auslesen der Daten soll in einer Silverlight Web Applikation stattfinden. Diese soll nicht, wie in den meisten Beiträgen zum Client object model, in Form eines Sharepoint Webparts erstellt werden, sondern außerhalb von Sharepoint laufen.
Voraussetzungen für dieses Beispiel:
Los geht’s:
1. Im ersten Schritt muss ein neues Silverlight 3 Projekt innerhalb von Visual Studio angelegt werden. Zum Beispiel Silverlight 3 Navigation Application.
2. Die folgenden beiden DLLs werden als Referenz in dem Silverlight Projekt benötigt.
Wenn Visual Studio 2010(Beta 2) verwendet wird und nach dem Hinzufügen der beiden DLLs ein kleines rotes Ausrufezeichen an der Referenz kleben sollte, habt ihr nichts falsch gemacht. Dabei handelt es sich um einen Bug von Visual Studio 2010. Der Fehler ist in der Pfadtiefe des Projektes und der Silverlight DLLs begründet. Um den Fehler zu beheben habe ich das Projekt einfach unter C:\Projects gelegt.
3. Da sich Sharepoint 2010 und das Silverlight Projekt in einer unterschiedlichen Domain befinden, wird der Zugriff auf den Client Context verweigert. Silverlight benötigt eine Clientaccesspolicy.xml Datei welche bestimmt, ob der Zugriff autorisiert ist. Diese Datei muss sich im Rootverzeichnis des Webservers befinden. Hier kommen die domain policy helper von Tim Heuer ins Spiel. Innerhalb des Webprojektes der Silverlightanwendung wird eine XML Datei mit den Namen Clientaccesspolicy.xml erstellt.
In dieser Datei wird das Snippet Menü via STRG+K+X aufgerufen und das Silverlight Clientaccesspolicy.xml Snippet ausgewählt. Der folgende Inhalt sollte erscheinen.
Wichtig: Vor Verwendung der Datei muss ein IIS Reset erfolgen.
4. Auf der darstellenden Seite benötigen wir ein Anzeigeelement für die Listen Daten. Dazu empfiehlt sich ein Datagrid. Dieses kann, basierend auf einem Datenobjekt, seine Spalten dynamisch generieren.
<data:DataGrid AutoGenerateColumns="True" Height="200" Name="einkauf" Width="311" HorizontalAlignment="Left" />
Mit diesem XAML Code wird ein Datagrid mit dem Namen “einkauf” erstellt, welches automatisch seine Spalten generiert.
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 “einkauf” Datagrid zu befüllen.
6. Basierend auf dem Datenobjekt wird eine Liste erstellt.
private List einkaufList = new List();
7. Wie im Titel erwähnt, nutze ich in diesem Beispiel die synchrone Datenübertragung. Für synchrone Anfragen wird die Methode ExecuteQuery() genutzt, für asynchrone ExecuteQueryAsync . ExecuteQuery darf nicht eingesetzt werden, falls damit das Laden des User Interfaces beeinträchtigt wird. Falls die Methode trotzdem verwendet wird, tritt folgende Exception auf.
InvalidOperationException. The method or property that is called may block the UI thread and it is not allowed.
Um dieser Exception aus dem Weg zu gehen, wird die Methode LoadSharepointContext in einem Hintergrundprozess ausgefü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 erfolgreich, sollte die einkaufList nun mit den Daten der Sharepoint Liste gefüllt sein.
Als letzter Schritt muss nun die Liste dem Datagrid als Quelle zur Verfügung gestellt werden. Dabei muss beachtet werden, 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 erfolgreich sollte das Datagrid wie folgt aussehen.
Tipp: Sollte ein Zugriff auf eine Eigenschaft eines SP Objektes erfolgen, ohne die Query vorher abgesetzt zu haben, erhält man die folgende Exception :
PropertyOrFieldNotInitializedException. Diese Exception tritt solange auf, bis eine Eigenschaft geladen und die Query mittels ExecuteQuery abgesetzt wurden ist.
Wie die asynchronen Anfragen an Sharepoint mit dem Client object model realisiert werden, zeige ich im nächsten Blogeintrag.
Für alle, die sich mit dem neuen Visual Studio und dem .NET Framework 4.0 vertraut machen wollen oder mehr erfahren möchten, hat Microsoft das neu aktualisierte Visual Studio 2010 and .NET Framework 4 Training Kit veröffentlicht. Das am 11.01.2010 veröffentlichte 151 MB große Paket enthält eine Vielzahl von Präsentationen, Demos und Tutorials. Genau genommen 17 Präsentationen, 21 Demos und 26 Tutorials sowie 10 Videos. In dieser Version des Kits wird auch auf die Themen Office, SharePoint und Application Lifecycle Management eingegangen. Der Download lohnt sich auf alle Fälle.
Der Communardo Inline Process Editor (IPE) ist ein Silverlight-Control, welches es ermöglicht, klar definierte Prozesse direkt in einem angebundenen Content Management System zu modellieren. Zur Zeit ist die Anbindung an den Microsoft Sharepoint Server 2007 und Atlassian Confluence realisiert. Eine Anbindung an beliebige weitere webbasierte Systeme ist dank einer klar definierten Schnittstelle mit nur wenig Aufwand möglich.
Nachdem wir den IPE auf verschiedenen UserGroups und Konferenzen vorgestellt haben, gibt es nun ein Demo-System wo jeder den IPE einmal ausprobieren kann.
Zugangsdaten zum DemoSystem:
http://projekte.communardo.de/websites/ipedemo (User: ipedemo, Password: Communardo09!)
Auch wenn der IPE nicht so bunt und animiert wie die meisten Silverlight-Anwendungen ist, hat er doch einen entscheidenden Vorteil: Er ist praxisrelevant. Daher haben wir uns entschlossen, ihn bei der Silverlight Coding Competition von ComponentArt.com einzureichen. Wir freuen uns natürlich über jede positive Bewertung und jede Menge Feedback (Kommentarfunktion an diesem Artikel oder gern auch per Mail).


Am 09.09.09 fand bei Communardo das erste Treffen der .Net Usergroup Dresden nach der Sommerpause mit über 20 Teilnehmern statt. Folgende Themen standen auf der Agenda:
Derzeit sieht man viele Silverlight-Anwendungen, die vor allem auf die Demonstration der „Killer-Features“ von Silverlight (z.B. Deep Zoom) zielen. Wie sieht es nun aber mit einer „ernsthaften“, produktiven Anwendung aus? Kai-Uwe Gärtner stellte einen bei Communardo auf der Basis von AJAX und Silverlight entwickelten Prozess-Editor vor, der das Anzeigen und Bearbeiten einfacher Prozessdiagramme direkt im Browser ermöglicht und damit lokale Visio-Installationen überflüssig macht. In der Präsentation war zu erfahren, wie die Vorteile von Silverlight (Vektorgrafiken, Skalierbarkeit, Drag & Drop) mit denen von SharePoint (Versionierung, Berechtigungen, Veröffentlichung) kombiniert werden können. Außerdem wurde natürlich auf die technischen Details der Umsetzung und die Stolpersteine bei der Verwendung von Silverlight eingegangen.

Robert Mühsig brachte uns in seinem Vortrag zu Windows Azure nahe, was Cloud Computing bringt und wie es funktioniert. Hauptthema war die Windows Azure Platform – hier wurden Fragen wie Storage, Rollen und Skalierbarkeit behandelt. Aber auch solche Punkte wie “Skalierbar denken & entwickeln” wurden hinterfragt. Bei den Azure Services griff Robert vor allem SQL Azure sowie die .Net Services heraus. Allerdings wurde hier konstatiert, dass sich der Access Control Service und der Workflow Service derzeit noch in einem eher experimentellen Stadium befinden – einzig der Service Bus, welcher es unter anderem ermöglicht, verteilte Anwendungen zu schreiben, die über Firewall Grenzen hinweg miteinander kommunizieren können, scheint schon etwas ausgereifter zu sein. Den Abschluss bildete ein Blick auf das (eher komplexe) Preismodell.

Nach einem stärkenden Imbiss lieferte Oliver Guhr mit einer ausdrücklich nicht zur Nachahmung aufrufenden Präsentation zu “Worst Practises in der Softwareentwicklung” den Einstieg in den Erfahrungsaustausch zu diesem Thema. Die “Tipps & Tricks” zur Frage “Was muss man tun, um ein Projekt ganz sicher gegen den Baum zu fahren?” ernteten viel Heiterkeit – aber manch einem blieb gelegentlich das Lachen auch im Halse stecken: kam einem der “Negativratschlag” doch allzu bekannt vor… Die anschließende engagierte Diskussion zeigte, dass dieses Thema den Nerv vieler der anwesenden Entwickler traf und solche Begriffe wie Softwareentwicklungsprozess, Anforderungsmanagement, Code Quality, Testing, Refactoring oder “Programmiererehre” keine Fremdworte in der Dresdner .Net-Entwicklergemeinde sind.
Als nach über 3 Stunden die letzten Teilnehmer aufbrachen, ging ein sehr interessanter und informativer Abend zu Ende. Die Slides zu den Präsentationen sind wie immer sicherlich bald auf den Seiten der .Net Usergroup Dresden zum Download verfügbar.
Gestern fand in Stuttgart der iX-Day rund um SharePoint
statt. Ziel der Konferenz war es, den Teilnehmern eine breite Kommunikationsplattform rund um SharePoint in der Praxis zu bieten. Hierzu haben renommierte Unternehmen über ihre mit SharePoint gesammelten Erfahrungen berichtet. In Fachvorträgen wurden Neuigkeiten sowie lösungsorientierte Szenarien und Best Practices sowie Case Studies vorgestellt. Die Konferenz richtete sich mit praxisnahen Vorträgen vor allem an Architekten, Administratoren, Anwender und Entwickler sowie Personen, die generell an SharePoint interessiert sind, weil sie zum Beispiel SharePoint in ihrem Unternehmen einführen wollen.
Kai-Uwe Gärtner von Communardo stieß mit seinem Vortrag zum Thema Silverlight und SharePoint
auf ein sehr interessiertes Publikum. Der Vortrag stellte einen bei Communardo auf der Basis von AJAX und Silverlight entwickelten Prozess-Editor-Webpart vor. Die Präsentation, in welcher zu erfahren war, wie die Vorteile von Silverlight (Vektorgrafiken, Skalierbarkeit, Drag & Drop) mit denen von SharePoint (Versionierung, Berechtigungen, Veröffentlichung) kombiniert werden können, fand sehr gute Resonanz. Hier gibt es die Folien zum Download.
Die Sponsoren, Aussteller, Veranstalter und Teilnehmer sind sich einig, die Konferenz war ein großer Erfolg und sollte bald eine Neuauflage finden.
Der iX-Day rund um SharePoint findet am 9. Juli 2009 in Stuttgart statt. Er richtet sich in zwei parallelen Tracks mit durchaus vielversprechenden Vorträgen an unterschiedliche Zielgruppen:
Communardo wird mit einem Vortrag zum Thema Silverlight und SharePoint vertreten sein, welcher einen bei Communardo auf der Basis von AJAX und Silverlight entwickelten Prozess-Editor-Webpart vorstellt. In der Präsentation ist zu erfahren, wie die Vorteile von Silverlight (Vektorgrafiken, Skalierbarkeit, Drag & Drop) mit denen von SharePoint (Versionierung, Berechtigungen, Veröffentlichung) kombiniert werden können – und warum Entwickler manchmal gefährlich leben…
Wir freuen uns, dass wir uns aktiv an der Konferenz beteiligen und diese hoffentlich mit einem spannenden Vortrag bereichern können!
XTOPIA [kompakt] – die UX/Web/RIA Roadshow 09 tourt zur Zeit durch Deutschland und wir (die Microsoft Freaks bei Communardo
) waren am 12.05.2009 in Berlin dabei.
Zu sehen und hören gab es eine Menge an bekannten und neuen Themen, die da waren: User Experience und Windows 7, Internet Explorer 8, Windows Live Services, Silverlight, Microsoft Surface sowie Visio für Webentwickler. Leider habe ich im Web bisher nirgendwo die Slides der Vorträge zum Download gefunden, lediglich für den Vortrag zu Windows Live Services gibt es hier einen Preview der Slides.
Besonders hervorheben möchte ich hier 2 Vorträge: Der Vortrag “Mit Microsoft Silverlight Next Generation Rich Internet Applications entwickeln” von Oliver Scheer zeigte anschaulich, was mit Silverlight so alles geht, wie Expression Blend effektiv eingesetzt werden kann und welche Neuerungen in der nächsten Version zu erwarten sind. Mit dem Video Sehen heißt verstehen! schaffte Florian Müller einen effektvollen Einstieg in seinen gleichnamigen Vortrag zum Einsatz von Visio für Webentwickler. Der zog sich mit solchen Aussagen wie “Visio ist die Reinkarnation der doppelten Negation” durch den gesamten Vortrag, besonders interessant fand ich die Tipps, bei Bedarf die Shape Sheets in Visio anzupassen und den Built-in Website-Dokumentierer zu verwenden sowie den Verweis auf visiotoolbox.com mit einer Menge Tipps, How-Tos und kostenlosen Add-Inns.
Zusätzlich gab es auch noch ein paar “Werbevorträge”, die sich aber meist in erträglichem Rahmen hielten und für das Sponsoring einer solchen Veranstaltung wohl unumgänglich sind. Immerhin war die Teilnahme kostenlos – sogar incl. Catering
.
Alles in allem kann man konstatieren, dass der Ausflug nach Berlin sich gelohnt hat, gerne mal wieder!
Update vom 14. Mai 2009:
Langsam sickert immer mehr durch. So war heute bei Mary Jo Foley folgendes zu lesen:
Inhalt vom 11. Mai 2009:
Das SharePoint Team hat jetzt offiziell die voraussichtlichen Systemanforderungen von SharePoint 2010 bekannt gegeben.
Weiter heißt es:
Voller Beitrag unter: http://blogs.msdn.com/sharepoint/archive/2009/05/07/announcing-sharepoint-server-2010-preliminary-system-requirements.aspx
Im Anschluss an die kurze Präsentation auf der SharePoint UserGroup habe ich Silverlight und unseren Prozess-Editor in etwas erweiterter Form an der HS Zittau/Görlitz vorgestellt. Näheres dazu kann man im Bereich Meldungen der Hochschule nachlesen: Kolloquium im Fachbereich Informatik: Silverlight 2.0 im Unternehmenseinsatz.
Interessant fand ich in den Gesprächen vor und nach dem Vortrag, dass obwohl an der HS eher Java vorherrscht, sich die Studenten anscheinend eher für C# entscheiden, wenn sie ihre Programmiersprache frei wählen können.
Als wir kurz das Thema Linux-Support gestreift haben (Stichwort: Moonlight) tauchten auch direkt Fragen zu den Lizenzen für die Multimedia-Codecs auf.
Ich habe deshalb jetzt im Anschluss nochmal ein wenig recherchiert: Die Zusagen von Microsoft zum Thema Moonlight kann man nachlesen unter: http://www.microsoft.com/interop/msnovellcollab/moonlight.mspx.
Und zum Thema Multimedia-Codecs gibt es außerdem einen interessanten Blog-Eintrag über das Microsoft Media Pack.
Releaseparty at Atlassian? Confluence 3.2 BETA and 3.1.2 with soms bugfixes were released yesterday. [...]
Tino Schmidt's Vortrag zu Enterprise Mashups auf der webciety, 4.3 Remix the Web http://bit.ly/d26rtA [...]
neuer Blogpost: February Cumulative Update (2010) http://bit.ly/cwxZGE [...]
Webinar am 16.03.: „Communote Enterprise Microblogging - Funktionen und Einsatzbereiche im Unternehmen“ http://bit.ly/96eexF [...]