Startseite > Techblog > Artikel mit dem Tag: net
nächste Seite
thu

Am 24.02.2010 haben sich die .NET Freaks aus Dresden und Umgebung zur .NET Usergroup bei uns im Hause zusammen gefunden. Diesmal wurde es gruselig. Alexander Groß führte uns durch ein aktuelles Projekt, welches sich rund um die  Bestattung und Einäscherung dreht. Die Idee des Vortrages, welcher eigentlich kein Vortrag im engeren Sinne darstellte, war die gemeinsame Betrachtung eines aktuellen Projektes und deren verwendeten Techniken.

Schon nach einigen Minuten kam es zu interessanten Diskussionen.

Alexander zeigte beispielsweiße wie in seinem Projekt Rake verwendet wird um auf einfache Weise Konfigurationen leicht wartbar zu halten. Außerdem wie Rake und MSDeploy zusammen ein super Team darstellen um Anwendungen zu deployen.

Artikel vollständig lesen »

Kommentar Feed Trackback URL
thu

Jetzt ist schon fast ein halbes Jahr vergangen, als ich mich das letzte Mal mit dem Cross Site Scripting Filter (XSS) von Sharepoint 2007 befasst habe. Dieser stellt einen wesentlichen Bestandteil von Sharepoint dar und bereitete mir damals schon sehr viele Kopfschmerzen. Prinzipiell besteht die Aufgabe des XSS Filters darin, schädlichen Code oder Skripte aus dynamisch generierten HTML Seiten zu entfernen. Dass der Filter manchmal etwas willkürlich arbeitete hatte ich damals in meinen Blogbeitrag bereits gezeigt.

Was bisher geschah: Sharepoint und der eigensinnige XSS – Filter (Bericht)

Grund genug, sich einmal die Unterschiede zwischen Sharepoint 2007 und Sharepoint 2010 anzuschauen.

Um die Unterschiede zu verdeutlichen, habe ich ein HTML Quelldokument, jeweils mit einem Sharepoint 2007 und mit einem Sharepoint 2010 Server programmatisch importiert.

Folgender Programmcode kam dabei zum Einsatz.

class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("http://....."))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
                    string pageFileName = "Test";

                    PageLayout[] pageLayouts = pubWeb.GetAvailablePageLayouts();
                    PageLayout currPageLayout =  pageLayouts[4];

                    PublishingPageCollection pages = pubWeb.GetPublishingPages();
                    PublishingPage currentPage = pages.Add(string.Concat(pageFileName,".aspx"),currPageLayout);

                    string htmlContent = GetFileContent();

                    currentPage.ListItem[FieldId.PublishingPageContent] = htmlContent;
                    currentPage.ListItem.Update();
                    currentPage.Update();
                    currentPage.CheckIn("Checked in by me");
                }
            }
        }

Die Ergebnisse des Tests zeigt die folgende Tabelle.

Sharepoint 2010 vs. 2007

Sharepoint 2010 vs. 2007

Positiv fällt auf, dass Sharepoint 2010 endlich die Anführungszeichen an Attributen unangetastet lässt. Die 2007 er Version löschte derartige Zeichen kompromisslos weg. Kommentare akzeptiert Sharepoint 2010 immer noch nicht als HTML Elemente – sie werden ebenfalls gelöscht. <li> Elemente dürfen keine Bilder als Listen Icons besitzen. Möchte man sein eigenes Icon zu einer Liste hinzufügen sollte auf eine externe CSS Klasse zurück gegriffen werden (Dies ist in jedem Falle zu empfehlen). Die Eigenschaften “inherit” sowie “none” hingegen werden unterstützt.

Script Tags werden völlig korrekt entfernt. Ebenso Iframe Elemente. Diese sind nicht erwünscht.

Weiterhin positiv aufgefallen ist, dass Elemente des Typs <input/> endlich korrekt geschlossen werden. Das Attribut “Name” wird leider gelöscht. Warum kann ich mir nicht erklären, es scheint aber so, als würden alle Attribute mit der Bezeichnung “name” gelöscht.

Als letzte Besonderheit fällt auf, dass Sharepoint nun konsequent alle absoluten Urls in relative überführt. In Sharepoint 2007 blieben absolute Urls unangetastet. Relative Urls, welche keinen Bezug zu dem aktuellen Sharepoint Server besitzen, wie etwa <a href=”../../beispiel.htm”>, werden weiterhin gelöscht.

Fazit: Es scheint als hätte sich das Sharepoint Entwicklungsteam einige Gedanken über XHTML & Co gemacht. So fallen die geschlossen Tags sowie die Anführungszeichen positiv auf. Einige Baustellen bleiben weiterhin offen.

Kommentar Feed Trackback URL
thu

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:

  • installiertes Visual Studio, Sharepoint 2010 sowie ein angelegtes Silverlight Projekt
  • unbedingt auf die Verwendung der Clientaccesspolicy achten( siehe vorheriger Eintrag)

Los geht’s:

1. Es sind die Schritte 1. – 6. des Blogeintrages “Sharepoint 2010: Client object model &amp; 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.

Kommentar Feed Trackback URL
thu

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.

  • für .NET clients steht die  Microsoft.SharePoint.Client.dll im “14\ISAPI”  Ordner zur Verfügung
  • Für Silverlight clients 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 clients die SP.js file aus dem  “14\LAYOUTS” Ordner

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:

  • installiertes Sharepoint 2010 inkl. Silverlight 3
  • eine Sharepoint Liste mit Daten
    • In meinem Fall, meine Einkaufsliste

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.

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

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.

Kommentar Feed Trackback URL
thu

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.

Artikel vollständig lesen »

Kommentar Feed Trackback URL
mhy

Am 10.12. fand in Chemnitz ein Treffen der .NET Usergroup statt. Dieser Termin stand voll und ganz unter dem Thema SharePoint.

Da wir während unserer täglichen Arbeit sehr viel mit SharePoint zu tun haben und auch die SharePoint Usergroup hier in Dresden mit veranstalten, nutzten Anne Rüger, Torsten Hufsky und ich die Gelegenheit für einen Ausflug nach Chemnitz. Im TCC angekommen wurden wir sehr freundlich aufgenommen.

In einer ersten Präsentation gab ich einen kurzen Überblick über die Features von WSS 3.0 und MOSS 2007. An ein paar Beispielen zeigte ich, wie man Workspaces erstellt, Listen anlegt, mit Hilfe der Tools Central Administration und stsadm das Portal administrieren kann und im den SharePoint Designer einfache Workflows zu erzeugen.

Im weiteren Verlauf gaben Anne und Torsten einen kurzen Einblick, wie man serverseitig auf das Objektmodell zugreift und was man dabei beachten muss – als Stichworte hierfür: “Disposing von Objekten”, “Elevated Privileges”  – und wie man von einem Client mit Hilfe der integrierten Webservices auf Listen und Webs zugreift.

Das Feedback der anderen Teilnehmer war durchweg positiv und auch wir hatten viel Spaß dabei, das Produkt vorzustellen, etwas aus dem Nähkästchen zu plaudern und spannende Themen mit denjenigen zu besprechen, die schon Erfahrungen hatten und über ähnliche Probleme gestolpert sind und Erfolgserlebnisse zu teilen.

Ich bin schon sehr gespannt und freue mich auf weitere Treffen und auf gemeinsame Themen.

Kommentar Feed Trackback URL
thu

Am 2. Dezember 2009 fand in Düsseldorf der 2.  iX Day rund um SharePoint statt. Nach dem Erfolg des ersten iX Tages im Juli sollte sich diesmal alles rund um Sharepoint, speziell Sharepoint 2010 drehen. In über 25 Sessions kam der ambitionierte Sharepointer voll auf seine Kosten. Das Themengebiet erstreckte sich von entwicklerlastigen Vorträgen, welche sich mit der API Unterstützten Programmierung von Sharepoint befassten über Vorträge der administrativen Art bis hin zur neuen Sharepoint Pie.

Artikel vollständig lesen »

Kommentar Feed Trackback URL
lke

Jeder, der schon einmal ein Websitetemplate erstellt hat, kennt den mühseligen Weg über die vielen Menu Punkte. Meist muss man erst einmal in die “Websiteeinstellungen” (Webseitaktionen -> Webseiteinstellungen -> Alle Websiteeinstellungen ändern). Dort findet man unter
“Aussehen und Verhalten” -> “Seitenlayouts und Websitevorlagen”. Dort kann man nun seine eigenen Webtemplates auswählen.

Da das ganze aber wenig praktikabel und umständlich ist, empfiehlt es sich, diese Schritte über einen Feature Receiver zu erledigen.

Artikel vollständig lesen »

Kommentar Feed Trackback URL
dri

Communardo tritt als Media-Sponsor der BASTA! Spring 2010 auf. Sie findet vom 22.-26. Februar 2010  in Darmstadt statt und soll dem Wissens- und Erfahrungsaustausch zur .Net und SharePoint Technologie dienen.

Von Silverlight 3.0 bis Windows Azure, von Windows 7 über Visual Studio 2010 und Visual Studio Team System 2010 bis C# 4.0 und last but not least SharePoint 2010: Auf .NET-Entwickler warten viele Änderungen und Neuerungen. Auf der BASTA! Spring 2010 wird es wieder die bestmögliche Unterstützung für Ihre alltägliche Arbeit und Ihre Projekte geben. In Form von Best Practices, Hands-on Power Workshops und interessanten Sessions bieten Ihnen namhafte nationale und internationale .NET-Experten Tipps, Ideen, Unterstützung und Antworten für Ihre laufenden und zukünftigen Projekte.

Neben dem vielfältigen Programm der Hauptkonferenz beleuchten verschiedene Special Days wie z.B. der Architecture/ALM Day und die SharePoint Days wichtige Themen in einem umfassenden Sinne. Moderiert von einem Experten des jeweiligen Themas, bieten sie in zahlreichen Vorträgen umfassendes Wissen sowie einen idealen Rahmen für den Erfahrungsaustausch.

Programm und Anmeldung finden Sie  unter http://it-republik.de/dotnet/basta10spring/

Kommentar Feed Trackback URL
mhy

Am 10.12.2009 findet ein Treffen der .NET Usergroup Chemnitz statt. Das Spannende daran ist, dass es diesmal für die Teilnehmer ein kleiner Blick über den Tellerrand wird. Der Termin hat nämlich das große Thema SharePoint. Aus diesem Grund wird es an diesem Tag 2 Vorträge geben, die das Thema etwas näher beleuchten und den Einstieg in die Entwicklung mit SharePoint geben sollen.

Kleiner Bruder – großer Bruder
Sowohl WSS als auch auch sein “großer Bruder” MOSS 2007 sind leistungsfähige Collaboration-Tools. In einer einführenden Präsentation wollen wir zeigen, wie die grundlegende Architektur dieser Lösungen aussieht und welche Gemeinsamkeiten und Unterschiede es inhaltlich gibt.  In wenigen No-Code-Beispielen wird demonstriert, wie ein Portal zusammengestellt und konfiguriert werden kann.

using (new SharePoint())
Für Entwickler am interessantesten sind immer Code-Beispiele und die sollen natürlich auch nicht zu kurz kommen, wenn wir auf einer Entwickler Usergroup sind. Über das Objektmodell und die bereitgestellten Webservices kann der SharePoint ganz leicht an eigene Bedürfnisse angepasst werden. Eigene WebParts, Workflows und Features können leicht in das Portal integriert werden und Funktionen bereitstellen, die es mit Standard-Boardmitteln nicht gibt.

Nähere Informationen zum eigentlichen Termin und unter anderem auch zu Ort und genauer Startzeit findet man auf der Seite der .NET Usergroup Chemnitz.

Kommentar Feed Trackback URL
nächste Seite

Tag Cloud

Unsere Themen

Kommentare

  • SharePoint_Team: Rückblick zum Treffen der .NET Usergroup Dresden am 24.02.2010: im #Communardo #Techblog...
  • TorstenHu: Rückblick zum Treffen der .NET Usergroup Dresden am 24.02.2010: im #Communardo #Techblog...
  • SharePoint_Team: Neuer Blogpost zur #BastaCon im #Communardo #TechBlog: http://tinyurl.com/yjqyqpb This comment was...
  • SharePoint_Team: Nur noch etwa 1 Stunde, dann beginnt die .NET Usergroup… http://bit.ly/dxDoKg This comment was...
  • SharePoint_Team: RT @TorstenHu: ViS is waiting for an operation oder Warum Copy & Paste schlecht ist: #Communardo...

Twitter